函数闭包

函数返回值,会优先寻找形参内的值,如果没有形参,会向外寻找变量。

	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值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值