js--this,严格模式下的this

  • 首先要明白,this指向是在创建函数上下文的时候创建的,也就是执行的时候。所以this永远都是指向调用它的那个对象。
  • 对于用户自定义的方法,所有的函数调用都可以转换成apply或call的形式,具体规则如下:
    • obj.child.method(p1, p2) 等价于obj.child.method.call(obj.child, p1, p2)
    • 非严格模式:foo(p1,p2) 等价于 foo.call( window, p1, p2)
    • 严格模式:foo(p1,p2) 等价于 foo.call( undefined, p1, p2)
注:这里只是针对用户自定义的方法,如果是JS内置的全局方法,如setTimeout,不论是setTimeout()还是window.setTimeout()形式的调用,回调函数内部的this都会指向window
  • 例如:
    function fn() {
    console.log(this);
    }
    fn(); // window对象
    window.fn(); // window对象

    • 解析:在普通模式下,this指向undefined时会被转向window,所以第一个函数的this指向的是window,第二个函数不用多说很明显。
  • 严格模式下,this指向undefined时不会转向window:
    function fn() {
    'use strict';
    console.log(this);
    }
    fn(); // undefined, fn是调用者,独立调用,
    window.fn(); // window, fn是调用者,被window所拥有

一些可能需要快速记忆一下的地方:
  • setTimeout(fn,1000)中的fn中的this,永远都是指向window对象,无论是否严格模式。
  • 回调函数中,this指向的是((调用该回调函数)的函数)的调用对象
    • 例如:$("button").click( fn ) // fn里如果有this,指向的是button的DOM对象
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容