function类型
每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法
函数是对象,函数名是指针
-
function的创建
声明式创建
function add(num1, num2) { return num1 + num2; }
表达式创建
var sub = function (num1, num2) { return num1 - num2; }; var sub2 = sub; console.log(sub2(1, 3));//-2
-
function没有重载
函数名相同但必须在下列一个或两个方面有所区别的两个函数:
1、函数的参数个数不同。
2、函数的参数类型不同或者参数类型顺序不同
function没有重载,只有覆盖
function sum(num1, num2) { return num1 - num2; }; function sum(num1, num2) { return num1 - num2 + 10; }; // 前面的函数覆盖了前面的函数 console.log(sum(2, 5));//7
-
function的声明式提升
预解析
预解析会做什么?
变量的值会定义成undefind 函数声明式会被解析在 当前所在的作用域的的最上边
(function () { console.log(sum(1, 4)); function sum(num1, num2) { return num1 - num2 + 10; }; // 下面代码会报错 console.log(add(1,4)); var add=function (num1,num2){ return num1+num2; }; })();
函数提升优先级比变量提升要高,且不会被变量声明覆盖,但是会被变量**赋值覆盖**
(function () {
console.log("打印的第一个a为" + a);//函数
function a() {
console.log("aaaaa");
}
var a;
a = 1;
console.log("打印的第二个a为" + a);//打印的第二个a为1
})();
-
作为值的函数
参数可以是函数,返回值也可以是函数
function callback(name) { console.log(name+"执行callback函数") } function doSomeThing(callback) { let name = "小米" callback(name); } doSomeThing(callback);//小米执行callback函数
-
function的arguments对象
function f1() { //使用arguments对象可以获取传入的每个参数的值 console.log(arguments); for(let i = 0;i<arguments.length;i++) { console.log(arguments[i]) } console.log(arguments.length); console.log(arguments.callee); } f1(10, 3, 34, 5, 2, 0);
-
function的this指向
this的引用是函数执行的环境对象
执行时离函数最近的对象就是执行环境对象,(不管参数中回调函数,
因为参数变量引用该回调函数,参数变量的指向还是执行环境对象)例子1
function foo(func) { func() } var obj = { name: "why", bar: function () { console.log(this); // window } } foo(obj.bar);
例子2
function foo() {
console.log(this); // obj1对象
}
var obj1 = {
name: "obj1",
foo: foo
}
var obj2 = {
name: "obj2",
obj1: obj1
}
obj2.obj1.foo();
例子3
function foo() {
console.log(this);//windows
}
var obj1 = {
name: "obj1",
foo: foo
}
// 讲obj1的foo赋值给bar
var bar = obj1.foo;
bar();
-
caller的指向调用当前函数的函数
function outer(){ inner(); } function inner(){ console.log("inner.caller="+inner.caller); } //指向调用inner的函数outer outer();//inner.caller = function outer(){inner();}
-
function的属性
length属性
function sayName(name) { console.log(name); } function sum(num1, num2) { return num1 + num2; } console.log(sayName.length);//1 console.log(sum.length);//2
-
function的prototype属性改变绑定执行环境对象的方法
(1)apply方法(执行函数环境对象,arguments/参数数组)
(function () { function sum(num1, num2) { return num1 + num2; } function callSum1(num1, num2) { console.log(this);//window对象 // apply调用特定函数 return sum.apply(this, arguments); } function callSum2(num1, num2) { console.log(this);//window对象 // apply调用特定函数 return sum.apply(this, [num1, num2]); } console.log(callSum1(10, 10)); console.log(callSum2(10, 10)); })();
(2)call方法(执行函数环境对象,参数1,参数2…)
(function () { function sum(num1, num2) { return num1 + num2; } function callSum(num1, num2) { // call调用特定函数,调用的参数必须逐个列举 return sum.call(this, num1, num2); } console.log(callSum(10, 20));//30 })();
(3)bind方法
(function() { window.color = "red"; var obj = { color: "blue" }; function sayColor() { console.log(this.color); } //bind方法会创建该函数的新实例,并把该实例绑定在放在参数位置的对象中 var objSayColor = sayColor.bind(obj); objSayColor();//blue sayColor();//red })();
-
function的方法