做为OO语言,c++、c#或者Java等语言,都有this的概念,JavaScript中存在this的概念,通常编程语言的this就是对象本身,而JavaScript的this却不必定!javascript
在JavaScript中,this所引用的对象(不少书籍叫函数上下文,我也这样叫吧)并非由声明函数的方式决定的,而是由调用函数的方式决定的,下面看代码:java
以上输出说明了下面几个问题:c++
顺便补充介绍下Function类的call()和apply()方法,它们都是用来调用函数的。
(1)call()方法编程
call(thisObject[, parameter])c#
参数thisObject是一个类,指定函数体内this关键字的值,该参数是必须的;
参数parameter是可选的,是要传递给函数的参数,能够指定0或多个参数(参数为用逗号分隔的列表)。数组
(2)apply()方法网络
apply(thisObject[, argArray])闭包
与call不一样的是,第二个参数是用数组模式来传递的。app
下面是闭包的内容了(下面部份内容参考于网络)编程语言
简单说下什么是闭包:
上面的第二定义是第一个补充说明,抽取第一个定义的主谓宾——闭包是函数的“局部变量”集合。只是这个局部变量是能够在函数返回后被访问。(这个不是官方定义,可是这个定义应该更有利于你理解闭包)。
作为局部变量均可以被函数内的代码访问,这个和静态语言是没有差异。闭包的差异在于局部变变量能够在函数执行结束后仍然被函数外的代码访问。这意味着函数必须返回一个指向闭包的“引用”,或将这个”引用”赋值给某个外部变量,才能保证闭包中局部变量被外部代码访问。固然包含这个引用的实体应该是一个对象,由于在Javascript中除了基本类型剩下的就都是对象了。惋惜的是,ECMAScript并无提供相关的成员和方法来访问闭包中的局部变量。可是在ECMAScript中,函数对象中定义的内部函数(inner function)是能够直接访问外部函数的局部变量,经过这种机制,咱们就能够以以下的方式完成对闭包的访问了。
请看如下代码:
再看一段定时器代码
另外,闭包有一个重要的特征:函数上下文毫不会被包含为闭包的一部分。例以下面的代码不会按照咱们指望的方式执行:
每一个函数调用都有其函数上下文(this指向的对象),所以上面的代码,传递给each()的函数上下文在回调函数内是来自于jQuery包装集的元素,而不是被设置为”someID”的外部函数属性。对回调函数的每一个调用都会依次弹出警告框,用来显示包装集中各个元素的id。
若是须要访问在外部函数中做为函数上下文的对象,能够考虑一般的习惯用法:在局部变量中建立this引用的副本,这个副本将会被包含在闭包中。