Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么javascript中的对象分解会影响作用域?_Javascript_Node.js_Ecmascript 6_Scope - Fatal编程技术网

为什么javascript中的对象分解会影响作用域?

为什么javascript中的对象分解会影响作用域?,javascript,node.js,ecmascript-6,scope,Javascript,Node.js,Ecmascript 6,Scope,我试图理解为什么对象分解会改变范围 (function() { var o = { add: function(a , b) { return a + b; }, log: function () { console.log(this); } } var { log } = o; o.log(); log(); })(); 此代码将记录两个不同

我试图理解为什么对象分解会改变范围

(function() {
    var o = {
        add: function(a , b) {
            return a + b;
        },
        log: function () {
            console.log(this);
        }
    }
    var { log } = o;
    o.log();
    log();
})();
此代码将记录两个不同的对象

第一个是预期的对象o,但第二个将记录全局对象

更新3-2021年5月: 如果您有相同的问题,并希望获得更详细的答案,请同时阅读以下内容:

这不完全正确 功能日志{ 控制台。记录'na aahh' } 作用{ 变量o={ 地址:functiona,b{ 返回a+b; }, 日志:函数{ log'hi,我是本地范围的'; } } var{log}=o; o、 日志; 日志 };这不完全正确 功能日志{ 控制台。记录'na aahh' } 作用{ 变量o={ 地址:functiona,b{ 返回a+b; }, 日志:函数{ log'hi,我是本地范围的'; } } var{log}=o; o、 日志; 日志
}; 你所做的或多或少相当于

const log = o.log
您已从对象中提取了一个方法,但尝试在不执行任何其他操作的情况下调用它,这将不会引用原始对象。你需要把它绑起来


你所做的或多或少相当于

const log = o.log
您已从对象中提取了一个方法,但尝试在不执行任何其他操作的情况下调用它,这将不会引用原始对象。你需要把它绑起来


这取决于您将其设置为什么:


这取决于您将其设置为什么:


这实际上与解构无关,而是与绑定的o.log和未绑定的log调用有关。只有使用前者,你才能得到正确的答案。这实际上与解构无关,而是与绑定的o.log和未绑定的log调用有关。只有用前者,你才能得到正确的答案。
(function() {
var o = {
    add: function(a , b) {
        return a + b;
    },
    log: function () {
        console.log(this);
    }
}
var { log } = o;
o.log();
// equivalent to
log.call(o);
})();