接上一篇Javascript this 的一些学习总结02【转自cnblogs的JKhuang】javascript
引用类型以及this的null值java
对于前面说起的情形,还有例外的状况,当调用表达式左侧是引用类型的值,可是this的值倒是null,最终变为全局对象(global object)。 发生这种状况的条件是当引用类型值的base对象刚好为活跃对象(activation object)。ajax
当内部子函数在父函数中被调用的时候就会发生这种状况,经过下面的示意代码介绍活跃对象:segmentfault
// Declares foo function. function foo() { function bar() { alert(this); // global } // The same as AO.bar(). bar(); }
因为活跃对象(activation object)老是会返回this值为——null(用伪代码来表示AO.bar()就至关于null.bar()),而后,this的值最终会由null转变为全局对象。数组
当函数调用包含在with语句的代码块中,而且with对象包含一个函数属性的时候,就会出现例外的状况。with语句会将该对象添加到做用域链的最前面,在活跃对象的以前。 相应地,在引用类型的值(标识符或者属性访问)的状况下,base对象就再也不是活跃对象了,而是with语句的对象。另外,值得一提的是,它不单单只针对内部函数,全局函数也是如此, 缘由就是with对象掩盖了做用域链中更高层的对象(全局对象或者活跃对象):app
函数做为构造器被调用时this的值ecmascript
函数做为构造函数时,咱们经过new操做符建立实例对象是,它会调用Foo()函数的内部[[Construct]]方法;在对象建立以后,会调用内部的[[Call]]方法,而后全部Foo()函数中this的值会设置为新建立的对象。函数
// Declares constructor function Foo() { // The new object. alert(this); this.x = 10; } var foo = new Foo(); foo.x = 23; alert(foo.x); // 23
手动设置函数调用时this的值post
Function.prototype原型上定义了两个方法,容许手动指定函数调用时this的值。这两个方法分别是:.apply()和.call()。这两个方法都接受第一个参数做为调用上下文中this的值,而这两个方法的区别是传递的参数,对于.apply()方法来讲,第二个参数接受数组类型(或者是类数组的对象,好比arguments), 而.call()方法接受任意多的参数(经过逗号分隔);这两个方法只有第一个参数是必要的——this的值。学习
经过示例代码介绍call()方法和apply()方法的使用:
var myObject = {}; var myFunction = function(param1, param2) { //setviacall()'this'points to my Object when function is invoked this.foo = param1; this.bar = param2; //logs Object{foo = 'foo', bar = 'bar'} console.log(this); }; // invokes function, set this value to myObject myFunction.call(myObject, 'foo', 'bar'); // logs Object {foo = 'foo', bar = 'bar'} console.log(myObject);
call()方法第一个参数是必要的this值,接着咱们能够传递任意多个参数,接着介绍apply()方法的使用。
var myObject = {}; var myFunction = function(param1, param2) { //set via apply(), this points to my Object when function is invoked this.foo=param1; this.bar=param2; // logs Object{foo='foo', bar='bar'} console.log(this); }; // invoke function, set this value myFunction.apply(myObject, ['foo', 'bar']); // logs Object {foo = 'foo', bar = 'bar'} console.log(myObject);
经过与call()方法对比,咱们发现apply()方法和call()方法没有太大的区别,只是方法签名不同。
总结
本文介绍Javascript中this的使用,更重要的是帮助咱们能更好地理解this值在全局、函数、构造函数以及一些特例的状况中值的变化。
对于在函数上下文中this的值是函数调用者提供而且由当前调用表达式的形式而定的。若是在调用括号()的左边有引用类型的值,那么this的值就会设置为该引用类型值的base对象。 全部其余状况下(非引用类型),this的值老是null。然而,因为null对于this来讲没有任何意义,所以会隐式转换为全局对象。
对于特例状况,咱们要记住赋值符、逗号操做符以及||逻辑表达式,会使this丢失原先的引用类型值,变成了函数类型,this的值就变成了全局对象了
参考