一道关于js this指向问题

新手上路,请多包涵
    var name = 'the window'
    var ob = {
        name: 'my object',
        getName: function(){
            return this.name;
        }
    }
    var a;
    console.log(ob.getName());  //my object
    console.log((ob.getName)());  //my object
    

为什么第二个显示my object? 立即执行函数this不是指向window吗?

阅读 2k
3 个回答

image.png
原文

image.png
原文

这是根据网上文章的一些解释

如果赋值给a,函数this就指向window

var a = ob.getName;
a(); //the window

(ob.getName)()ob.getName()意义一样。

就类似于数学中:a + b + c = (a + b) + c 一样,可以忽略。

1、问题是你的console.log((ob.getName)());不是有一个立即执行函数,只是把对象属性括起来了而已。
2、立即执行函数确实this指向window,看以下代码:ob.func属性值

var name = 'the window'
    var ob = {
        name: 'my object',
        getName: function(){
            return this.name;
        },
        func: (function(){
            return this.name;
        })()
    }
    var a = ob.getName;
    console.log(ob.getName());  //my object
    console.log(a());//the window
    console.log(ob.func);  //the window

3、再看上面a()执行,变量a和ob.getName都指向同一个函数体,变量a其实是window.a,因为全局变量和未用var申明的变量都属于对象window的属性。所以a执行的时候,打印the window

4、可能你对立即执行函数不太理解,立即执行函数,是有函数体function(){},你搞个变量名(ob.getName)()语义完全变了啊。
别搞那些花里胡哨的,立即执行函数是什么样的结构,找找资料看看吧。立即执行函数,给你看个例子吧。下面的都是立即执行函数。

(function(){
        console.log("aa")//aa
    })();
    +function(){
        console.log("bb")//bb
    }();
    -function(){
        console.log("cc")//cc
    }();
    1 &&(function(){
        console.log("dd")//dd
    })();
    0 || (function(){
        console.log("ee")//ee
    })()

实际上立即执行函数是一个表达式去执行。通常的(函数体)()就是表达式的执行,那么下面的几个例子也是让函数体变味儿表达式,然后执行的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题