js的this指向
2016-04-06 09:13
447 查看
先补充基础知识
秘密花园 和
廖雪峰js
1.在普通模式下和严格模式下,this指向不同,普通模式下this指向window全局变量,而严格模式指向undefined
2. 下面看这道题,会输出什么?
在严格模式下,输出10的那次的fn的this实际是undefined,在非严格模式下才成为了global,并且由于JavaScript允许传入任意个参数而不影响调用,因此传入的参数比定义的参数多也没有问题,虽然函数内部并不需要这些参数
至于第二的arguments[0]()的输出,你就想一下,arguments[0]就是fn,相当于arguments['fn'](实际上只能用index来获得,这么写是方便你理解),这个this是arguments.
其实绑定this的,除了显式的bind,apply,call,就是通过object.foo或者object['foo']来绑定
3.绑定this的几个方法,绑定this的,除了显式的apply,bind,call(俗称ABC方法),就是通过object.foo或者object['foo']来绑定
bind的返回值是函数,并且
②后面的参数的使用也有区别
这个区别不是很好理解
call 是 把第二个及以后的参数作为f方法的实参传进去,
而bind 虽说也是获取第二个及以后的参数用于之后方法的执行,但是f_Extend中传入的实参则是在bind中传入参数的基础上往后排的。
4.this 指向
* 全局范围内,当在全部范围内使用
* 作为一个对象的方法调用的时候,this 指向那个对象,比如 obj.fn()
* 作为一个普通函数(或者匿名函数)调用的时候,指向全局对象 window,比如 fn(),(这题属于这种情况,就算你把函数定义在里面也一样...)
* 构造函数中 this 指向实例化的对象
* 还有使用 call 和 apply 动态改变 this 的指向
举几个《JavaScript 高级程序设计》上第七章的栗子...
1. 不符合预期的闭包
为什么匿名函数没有取得其包含作用域(或外部作用域)的 this 对象呢?
前面曾经提到过,每个函数在被调用时都会自动取得两个特殊变量:this 和 arguments。而内部函数在搜索这两个变量时,只会搜索到其 AO 为止,所以永远不能直接访问到外部函数中的 this 和 arguments。
不过若是我们将外部作用域中的 this 对象保存在一个闭包能够访问到的变量里,就可以让闭包访问到该对象了:
2. 符合预期的闭包
结论:在对象的方法的内部函数(可以认为是二级函数)不会自动指向当前的对象,即就是在对象的内部函数里面调用的函数,并不会自动继承指向对象的this指针,而是指向window或者undefined
请看js秘密花园中的
this
秘密花园 和
廖雪峰js
1.在普通模式下和严格模式下,this指向不同,普通模式下this指向window全局变量,而严格模式指向undefined
2. 下面看这道题,会输出什么?
var length = 10; function fn(){ console.log(this.length); } var obj = { length:5, method:function(fn){ fn(); arguments[0](); } } obj.method(fn,1);
在严格模式下,输出10的那次的fn的this实际是undefined,在非严格模式下才成为了global,并且由于JavaScript允许传入任意个参数而不影响调用,因此传入的参数比定义的参数多也没有问题,虽然函数内部并不需要这些参数
至于第二的arguments[0]()的输出,你就想一下,arguments[0]就是fn,相当于arguments['fn'](实际上只能用index来获得,这么写是方便你理解),这个this是arguments.
其实绑定this的,除了显式的bind,apply,call,就是通过object.foo或者object['foo']来绑定
3.绑定this的几个方法,绑定this的,除了显式的apply,bind,call(俗称ABC方法),就是通过object.foo或者object['foo']来绑定
function foo(a, b, c) {} var bar = {}; foo.apply(bar, [1, 2, 3]); // 数组将会被扩展,如下所示 foo.call(bar, 1, 2, 3); // 传递到foo的参数是:a = 1, b = 2, c = 3
bind的返回值是函数,并且
②后面的参数的使用也有区别
function f(a,b,c){ console.log(a,b,c); } var f_Extend = f.bind(null,"extend_A") f("A","B","C") //这里会输出--> A B C f_Extend("A","B","C") //这里会输出--> extend_A A B f_Extend("B","C") //这里会输出--> extend_A B C f.call(null,"extend_A") //这里会输出--> extend_A undefined undefined
这个区别不是很好理解
call 是 把第二个及以后的参数作为f方法的实参传进去,
而bind 虽说也是获取第二个及以后的参数用于之后方法的执行,但是f_Extend中传入的实参则是在bind中传入参数的基础上往后排的。
4.this 指向
* 全局范围内,当在全部范围内使用
this,它将会指向全局对象。
* 作为一个对象的方法调用的时候,this 指向那个对象,比如 obj.fn()
* 作为一个普通函数(或者匿名函数)调用的时候,指向全局对象 window,比如 fn(),(这题属于这种情况,就算你把函数定义在里面也一样...)
* 构造函数中 this 指向实例化的对象
* 还有使用 call 和 apply 动态改变 this 的指向
举几个《JavaScript 高级程序设计》上第七章的栗子...
1. 不符合预期的闭包
前面曾经提到过,每个函数在被调用时都会自动取得两个特殊变量:this 和 arguments。而内部函数在搜索这两个变量时,只会搜索到其 AO 为止,所以永远不能直接访问到外部函数中的 this 和 arguments。
不过若是我们将外部作用域中的 this 对象保存在一个闭包能够访问到的变量里,就可以让闭包访问到该对象了:
2. 符合预期的闭包
请看js秘密花园中的
this
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- 深入理解PHP之匿名函数
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子