资讯专栏INFORMATION COLUMN

读书笔记(you don't know js): this的理解(没写完...)

freewolf / 803人阅读

摘要:基本概念首先,函数不能存储的值,指向哪里,取决于调用它的对象。如果没有这个对象,那默认就是调用非严格模式下。也就是说是在运行的时候定义的,不是在绑定的时候定义的。

基本概念

首先,函数不能存储this的值,this指向哪里,取决于调用它的对象。如果没有这个对象,那默认就是window调用(非严格模式下)。也就是说this是在运行的时候定义的,不是在绑定的时候定义的。

    function foo(num) {
        console.log("foo: " + num);
        this.count++
    }
    foo.count = 0;
    for(var i = 0; i < 10; i++) {
        foo(i);
    }
    console.log(foo.count) //输出是0,因为调
    console.log(window.count) // 输出是NAN, 因为window.count没有初始值

再贴一段代码

    function foo() {
        var a = 2;
        this.bar();
    }
    function bar() {
        console.log( this.a );
    }
    window.a = 3;
    foo();//输出3,这个时候,是window.foo,因为bar也是由window调用
隐式绑定的问题

先看一个例子

    function foo() {
        console.log(this.a)
    }
    
    var obj = {
        foo: foo,
        a: 2
     }
     var bar = obj.foo();// 函数别名
     var a = "opps, global";
     obj.foo();// 输出2
     bar();// 输出opps, global,调用bar的是window

这个情况比较容易导致我们在传回调函数的时候,出现this指向问题

    function foo() {
        console.log(this.a);
    }
    function doFoo(fn) {
        fn();
    }
    
    var obj = {
        a: 2,
        foo: foo
    }
    
    var a = "oops, global";
    doFoo(obj.foo); // 传递了一个函数过去,这个函数由window调用,所以最后输出的是"opps, global"

当然我们可以很简单地用一个bind来解决问题

    doFoo(obj.foo.bind(obj) 
显示绑定(未完待续)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103595.html

相关文章

  • You Don&#039;t Know JS》阅读理解——this

    摘要:运行规则根据的运作原理,我们可以看到,的值和调用栈通过哪些函数的调用运行到调用当前函数的过程以及如何被调用有关。 1. this的诞生 假设我们有一个speak函数,通过this的运行机制,当使用不同的方法调用它时,我们可以灵活的输出不同的name。 var me = {name: me}; function speak() { console.log(this.name); }...

    tianren124 评论0 收藏0
  • You Don&#039;t Know JS》阅读理解——作用域

    摘要:在我们的程序中有很多变量标识符,我们现在或者将来将使用它。当我们使用时,如果并没有找到这个变量,在非严格模式下,程序会默认帮我们在全局创建一个变量。词法作用域也就是说,变量的作用域就是他声明的时候的作用域。 作用域 定义 首先我们来想想作用域是用来干什么的。在我们的程序中有很多变量(标识符identifier),我们现在或者将来将使用它。那么多变量,我咋知道我有没有声明或者定义过他呢,...

    codeKK 评论0 收藏0
  • You Don&#039;t Know Js 阅读笔记

    摘要:回调传递函数是将函数当做值并作为参数传递给函数。这个例子中就是因为事件绑定机制中的传入了回调函数,产生了闭包,引用着所在的作用域,所以此处的数据无法从内存中释放。 javascript作用域 一门语言需要一套设计良好的规则来存储变量,并且之后可以方便的找到这些变量,这逃规则被称为作用域。 这也意味着当我们访问一个变量的时候,决定这个变量能否访问到的依据就是这个作用域。 一、词法作用域 ...

    wanglu1209 评论0 收藏0
  • [翻译]You Don&#039;t Know JS: this & Object Prot

    摘要:引用是从匿名函数内部引用自身的唯一方法,不过,最好的方法是避免使用匿名函数,至少在那些需要引用自身的时候,使用命名函数或者表达式。 [翻译]Chapter1 this or that 第一次翻译,翻译的不好,已经再尽全力s去翻译了,如果哪里看不明点,请出门左转下边原文地址 英文原文点击这里 javascript中最令人困惑的东西就是this关键字,它在每个函数作用域中都会自动定义的一个...

    mingzhong 评论0 收藏0
  • You don&#039;t know cross-origin

    摘要:为什么会存在跨域问题同源策略由于出于安全考虑,浏览器规定不能操作其他域下的页面,不能接受其他域下的请求不只是,引用非同域下的字体文件,还有引用非同域下的图片,也被同源策略所约束只要协议域名端口有一者不同,就被视为非同域。 showImg(https://segmentfault.com/img/remote/1460000017093859?w=1115&h=366); Why 为什么...

    hersion 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<