7、匿名函数/自执行函数
匿名函数:没有函数名的函数
(1)、创建匿名函数
function(){
return 'hi'; //单独的匿名函数是无法运行的,就算能运行也无法调用,因为没有名字
}
用匿名函数的好处就是,省得定义一个用一次就不用的函数,而且免了命名冲突的问题,js中没有命名空间的概念,因此很容易函数名字冲突,一旦命名冲突以最后声明的为准。
在javascript语言里任何匿名函数都是属于window对象。在定义匿名函数时候它会返回自己的内存地址,如果此时有个变量接收了这个内存地址,那么匿名函数就能在程序里被使用了,因为匿名函数也是在全局执行环境构造时候定义和赋值,所以匿名函数的this指向也是window对象
(function(){
console.log(this === window); //true
})();
document.body.οnclick=function(){} setTimeout(function(){},1000)
(2)、自执行匿名函数
自执行函数:定义和执行一起完成了
(function (){ // (匿名函数)();第一圆括号放匿名函数,第二个圆括号执行
alert('Lee');
})(); //Lee
把匿名函数自我执行的返回值赋给变量:
var box = (function (){ var box= (function () {
alert('Lee'); return 'Lee';
})(); //弹出"Lee"; })();
alert(box); //弹出 undefined console.log(box); //Lee
自执行匿名函数的传参:
(function (age){
alert(age);
})(100); //弹出100
自执行函数的写法 另一种语法也可得到同样结果: 将函数返回值分配给变量:
var result = function (){ var result = (function () { var result = (function () {
alert(2); console.log(2); return 2;
}(); })(); }());
~function(){}(); !function(){}(); +function(){}(); -function(){}(); ;(function () {})();
(3)、函数属性
函数有2个属性,length和prototype
length表示函数希望接收命名参数的个数。
function a(name){ function a(name,age){ function c(){
//todo //todo //todo
} } }
a.length //1 b.length //2 c.length //0
prototype属性对于引用类型来说很重要
每个函数都包含2个非继承的方法 apply,call.这两个方法的用途都是在特定的作用域中调用函数,其实就是设置函数体内的this指代的值。
apply()方法接收2个参数,
一个是函数运行的作用域,
另一个是参数数组(参数可以是数组的实例,也可以是arguments)
function sum(num1,num2){ function test1(a,b){ function test2(c,d){
return num1+num2; return sum.apply(this,arguments); return sum.apply(this.[c,d]);
} } }
console.log(test1(1,1)) //2 console.log(test2(1,1)) //2
call方法和apply方法区别就是call方法的第二个参数必须得传递的参数一个个列举出来。使用call和apply来扩充作用域最大的好处就是对象不和任何方法耦合
本人是以网络视频与网络文章的方式自学的,并按自己理解的方式总结了学习笔记。有不正确之处请各位高手多多指点,一起学习进步。【VX:czlingyun 暗号:CSDN】