javascript - 闭包,最后一个return 为什么是The Window?
黄舟
黄舟 2017-04-11 13:13:25
[JavaScript讨论组]

根据作用域链的原理,最后this.name不应该在object里面找吗?

var name = "The Window";
    var object = {
        name : "My Object",
        getNameFunc : function(){
            alert("My Object "+this.name); //MyObject
            return function () {
                alert("The Window "+this.name);
                return this.name;//This Window
            }
        }
    };
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(4)
PHP中文网

你这段代码其实没有必要用 作用域链 来解释

函数体内部的this指向是根据函数调用者来决定的。

我完善了一下你的代码,你应该能理解了。

var name = "The Window";
  var object = {
    name: "My Object",
    getNameFunc: function () {
      console.log("My Object ====>" + this.name); //MyObject
      return function () {
        console.log("The Window =====>" + this.name);
        console.log('this.name ====>'+this.name) ;//This Window
      }
    }
  };
  var obj = object.getNameFunc();
  obj();
  obj.call(object); // 这里通过call方法,改变了函数内部的this指向
ringa_lee
var name = "The Window";
var object = {
    name : "My Object",
    getNameFunc : function(){
        alert("My Object "+this.name); //MyObject
        var self = this; // 保存this
        return function () {
            // 函数内, 非 use strict; this 指向window
            alert("The Window "+self.name);
            return self.name; // 使用self替换this
        }
    }
};

或者定义个方法封装

function context(fn, ctex){
    return function(){ return fn.apply(ctex, arguments)}
}

// getNameFunc 方法改为:
getNameFunc : function(){
    alert("My Object "+this.name); //MyObject
    return context(function () {
        alert("The Window "+this.name);
        return this.name;
    }, this) // << 传递this至函数内
}

来个context实例

function showName(){
    return this.test_name;
}

alert( showName() ); // >> undefined

var data = {test_name:"hello"};
showName = context(showName, data);
alert( showName() ); // >> hello
伊谢尔伦

this跟根据函数实际调用情况来确定指向,因而你题目没有实际调用情况,我们是没法确定this到底指向了什么

ringa_lee

看返回的这个函数所处的环境是什么

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号