javascript - js 语法问题

查看:100
本文介绍了javascript - js 语法问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

    var out = 10,
        inner = {
            out: 20,
            func: function () {
                var out = 30;
                return this.out;
            }
         }

    console.log( (inner.func)() )    // 20

(inner.func)() 这段代码。 第一个括号里应该是会返回一个函数的吧,如果看成下面这样

(inner.func)() 等价于

(function () {
    var out = 30;
    return this.out;
})()

这样的话 那么这个函数的this就是window了,那么this.out就是10,显然是不对的

我觉得可能可以看成是这样的
(inner.func)() 等价于

var newFunc = func.bind(inner)  // 前一个括号返回了这个
newFunc()                       // 第一个括号运行

所以是怎么去理解这个括号运算符呢?你们怎么看?。。。。。。。。。。。

额。。这里补充一下。。。可能我没说清楚,你们说的什么this的指向。。这些我都懂

其实我是想问问js的括号运算符,看看你们怎么理解
就是

(inner.func)() 这样一个表达式 (inner.func)inner.func 加上这么一个括号能让其发生什么变化吗? 看起来是并没有变化。 因为我看到其他地方有人说()这个运算符会去取其中函数的引用。所以上面的两段代码

(function () {
    var out = 30;
    return this.out;
})()

这一段,意味着取得只是func的引用,这显然是不符合真实的运行结果的。
而我自己模拟出来的一段代码

var newFunc = func.bind(inner)  // 前一个括号返回了这个
newFunc()                       // 第一个括号运行

可以比较好的符合(inner.func) 的实际效果

解决方案

这个问题不错,为方便看清,我把你的例子稍作了修改:

var out = 10;

var inner = {
    out: 20,
    func: function () {
        var out = 30;
        console.log(this); // 看清 this 的本质
        return this.out;
    }
}
console.log( (inner.func)() ) // 20

console.log( (function() {
    var out = 30;
    console.log(this); // 看清 this 的本质
    return this.out;
})() ) // 10

不是 () 在决定 context,是 {} (非 function(){})在决定。{} 就是定义对象,() 的作用是取对象,跟 (1 + 2) * 3 的括号基本一个意思;function(){}() 是语法错误的,至于为啥没定义这么个语法,我也不知道,你知道了告诉我下。


有同学提到 !function(){}(),这和 (function(){})() 的 context 是一致的。但是为啥加个 ! 就可以不要括号,谁知道?


看其他答案有说看 this 指向要看谁在 call。我怎么就没想到呢,的确 inner.func.call(window),此时 context 就是 window 对象了。也就是说其实就是看谁在 call。

也就是说:

          oooo.xxxx() => oooo.xxxx.call(oooo)
xxxx() => this.xxxx() => this.xxxx.call(this)

xxxx 当然也可以是匿名函数,我假装 xxxx 就是它在我心里的名,:P。

这篇关于javascript - js 语法问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆