函数返回值,会优先寻找形参内的值,如果没有形参,会向外寻找变量。
var a = 10;
fucition foo(a){
console.log(a);
}
foo();// undifined
若没有形参,则实参是摆设。(形参相当于 var a;)
若没有实参,则形参若未赋值为未定义。
对于此类函数结构,要注意实参与形参的值传递过程。
立即调用的函数表达式 与自执行函数的区别:
自执行函数相当于 函数内部执行自身,进行递归
而前者的意思很明确:只是立即执行而已,并没有调用自身
立即调用的函数表达式 (立即执行省去了 命名 和 调用步骤 )
(function(a){
alert(a);
})("123")
//"123" 使用()运算符
(function(a){
alert(a);
}("123"))
//"123" 使用()运算符
!function(a){
alert(a);
}("123")
//"123"
在function前面加!、+、-、=都可以将函数声明转化为函数表达式,可以消除js引擎识别函数声明和函数表达式的歧义(但会不会带来负面效果?)
加()是最安全的方法,免得其他的和函数返回值进行运算
不过这样的写法有什么用呢?
javascript中没用 私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用 同名 的变量给覆盖掉,
根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,
“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,
所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。
JQuery使用的就是这种方法,将JQuery代码包裹在( function (window,undefined){…jquery代码…} (window)中,在全局作用域中调用JQuery代码时,可以达到保护JQuery内部变量的作用。
<font color=Purple当函数赋值给对象的属性,我们成为"方法",所有的JavaScript都有方法。
有时我们看见js函数后面跟着多个小括号是怎么回事?f( )( )( )…
f()意思是执行f函数,返回子函数
f()()执行子函数,返回孙函数
f()()()执行孙函数
但注意,如果想这样执行,函数结构必须是这样,f的函数体里要return 子函数,子函数里要return 孙函数,如果没有return关键字,是不能这样连续执行的,会报错的。
var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function() {
return function() {
return this.name;
};
}
};
alert(object.getNameFunc()()); //"The Window"(在非严格模式下)
即,由于 最里层函数 是被 外层函数 调用,而 外层函数 才是被 color=对象(object) 调用,其间隔了一层,因此,此时的this指向的是 全局对象!
(this直接调用对象,不看间接调用!)
每个函数在被调用时都会自动取得两个特殊变量: this 和 arguments。
内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。
不过,把外部作用域中的 this 对象 保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了,如下所示。
var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function() {
var that = this;
return function() {
return that.name;
};
}
};
alert(object.getNameFunc()()); //"My Object"
即第一个this,指向object这个对象,并保存在了that中,再使嵌套函数调用保存后的that值。