为了账号安全,请及时绑定邮箱和手机立即绑定

javascript对象、this、作用域和闭包的问题。

javascript对象、this、作用域和闭包的问题。

云淡风轻的天空 2016-10-29 01:02:50
以下几段代码,输出的结果不一样。希望有大神可以解答一下原理,谢谢! var myvar = "TheWindow"; var object = { myvar : "MyObject", getVar : function(){ return function(){ return myvar; }; } }; console.log(object.getVar()());//输出TheWindow function MyCont(){ var myvar = "MyObject"; this.getVar = function(){ return function(){ return myvar; }; } } var obj = new MyCont(); console.log(obj.getVar()());//输出MyObject 然后我修改了一下,加上了this,输出结果又不同了。 var myvar = "TheWindow"; var object = { myvar : "MyObject", getVar : function(){ return function(){ return this.myvar;//此处加入了this,依旧输出TheWindow }; } }; console.log(object.getVar()()); function MyCont(){ var myvar = "MyObject"; this.getVar = function(){ return function(){ return this.myvar;//此处加入了this,输出变成了TheWindow,而不是原先的MyObject }; } } var obj = new MyCont(); console.log(obj.getVar()()); 然后我再改一下 var myvar = "TheWindow"; var object = { myvar1 : "MyObject", getVar : function(){ return function(){ return myvar1;//虽然object内含有myvar1属性,但是这样写会报错,但是如果写this.myvar1的话就不报错,输出undefined }; } }; console.log(object.getVar()()); var myvar = "TheWindow"; var object = { myvar : "MyObject", getVar : function(){   return myvar;//此处去掉了function,还是输出TheWindow } }; console.log(object.getVar()); var myvar = "TheWindow"; var object = { myvar : "MyObject", getVar : function(){   return this.myvar;//对比上面,加入了this,则输出的是对象属性MyObject } }; console.log(object.getVar()); 最后还是要感谢一下,好心人帮忙解答问题,万分感谢!
查看完整描述

1 回答

已采纳
?
stone310

TA贡献361条经验 获得超191个赞

1、局部作用域,也称函数作用域,定义在函数内部,函数外部无法获取(可通过闭包获取);

2、全局作用域,定义在函数外,函数内部可以获取;

3、当一个变量在函数内部使用,会先去获取函数内部这个变量的值,如果不存在,则去获取函数外部这个变量的值;

4、this是在被调用的时候才确定的;

5、this的确定是根据被调用的方法是属于哪个对象的方法,存在这个对象,this指向它,不存在,this指向window;

6、以下的闭包内部的this全部指向window

    var myvar = "TheWindow";
    var object = {
        myvar : "MyObject",
        getVar : function(){
            return function(){             //闭包
                return myvar;         //函数作用域内部无myvar变量,则显示全局变量的值
            };
        }
    };
    console.log(object.getVar()());//输出TheWindow
    
    
    function MyCont(){
        var myvar = "MyObject";
        this.getVar = function(){
            return function(){          //闭包
                return myvar;            //函数作用域内部有myvar变量,则显示内部变量的值
            };
        }
    }
    var obj = new MyCont();
    console.log(obj.getVar()());//输出MyObject
    

    var myvar = "TheWindow";
    var object = {
        myvar : "MyObject",
        getVar : function(){
            return function(){       //闭包
                return this.myvar;//此处加入了this,依旧输出TheWindow       
      //因为这里闭包并不是作为某个对象的方法被调用,因此内部的this指向window,window.myvar就是变量myvar的值
            };
        }
    };
    console.log(object.getVar()());


function MyCont(){
    var myvar = "MyObject";
    this.getVar = function(){
        return function(){
            return this.myvar;//此处加入了this,输出变成了TheWindow,而不是原先的MyObject   
            //道理和上面例子相同,闭包内this指向window
        };
    }
}
var obj = new MyCont();
console.log(obj.getVar()());


var myvar = "TheWindow";
var object = {
    myvar1 : "MyObject",
    getVar : function(){
        return function(){
            return myvar1;//虽然object内含有myvar1属性,但是这样写会报错,但是如果写this.myvar1的话就不报错,输出undefined
          //这里涉及到JS变量和属性的应用,return myvar1的时候,myvar1是变量,而无论是局部作用域还是全局作用域都没有myvar1这个变量,因此报错,未定义;
          //如果return this.myvar1,通过上面的例子,这里this指的是window,这时候myvar1是作为一个属性,如果这个属性不存在,只会提示undefined,而不会报错;
        };
    }
};
console.log(object.getVar()());

var myvar = "TheWindow";
var object = {
    myvar : "MyObject",
    getVar : function(){
        return myvar;//此处去掉了function,还是输出TheWindow  
    //因为局部作用域中并没有myvar这个变量,然后就去查找全局作用域,所以是TheWindow,这里MyObject的这个myvar是属于object的属性
    }
};
console.log(object.getVar());


var myvar = "TheWindow";
var object = {
    myvar : "MyObject",
    getVar : function(){
        return this.myvar;//对比上面,加入了this,则输出的是对象属性MyObject   
      //getVar是在object对象上被调用的一个方法,因此它的this指的是object,因此object.myvar就是MyObject
    }
};
console.log(object.getVar());


查看完整回答
1 反对 回复 2016-10-29
  • 1 回答
  • 0 关注
  • 1201 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信