函数的创建
函数声明
function fn() {} //直接声明一个函数 可以被提升
函数定义
var fm = function () {}; //不会提升函数 必须定义完才可以使用
var obj = {
fn1: function () {},
};
函数自调用 只要不让function开头 都可以执行自调用 前面可以是+ - !各种符号
(function fn2() {
console.log(111);
})(); //111
// fn2(); 会报错 不能找到自调用的函数 自调用函数调用完立即销毁
new 调用函数(new 调用返回值为它创建的地址空间this)
var a = 100;
function fn4() {
console.log(a);
console.log(this.a);
}
var n1 = fn4();
var n2 = new fn4(); //括号可以去掉
console.log(n1, n2); //100 100 100 undefined undefined fn4{}
函数的方法
call && apply 调用函数并修改函数this指向
function fn() {
console.log(arguments);
console.log(this.name);
}
var obj1 = {
name: "张三",
},
obj2 = {
name: "李四",
};
fn.call(obj1); //张三
fn.call(obj2); //李四
fn.apply(obj1); //张三
fn.apply(obj2); //李四
call && apply区别
1.call方法可以传入多个实参并函数可以接收
2.apply方法只可以传入两个参数 第二个参数必须是引用数据类型 被解析后赋值给每一个形参 可以用数组将多个值存入
fn.call(obj1, 1, 2, 3, 5); //[1,2,3,5,]
fn.apply(obj1, [1, 2, 3, 5]); //[1,2,3,5,]
apply的应用
var arr = [12, 151, 61, 1545];
console.log(Math.max(12, 151, 61, 1545)); //只能这样用
console.log(Math.max(arr)); //NAN
console.log(Math.max.apply(null, arr)); //1545 第一个参数是this指向 可以直接为null不用管 apply会将第二个引用数据类型的参数进行解析
bind 返回值新函数 长得一样 给新函数绑定好this指向
var obj = {
name: 1,
};
function fnn() {
console.log(this);
}
var newfnn = fnn.bind(obj);
fnn(); //window
newfnn(); //{name:1}
var obj1 = {
name: 2,
newfnn: newfnn,
};
obj1.newfnn(); //{name:1} 绑定后函数的this值就不会改变了