以下几段代码,输出的结果不一样。希望有大神可以解答一下原理,谢谢!
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());
添加回答
举报
0/150
提交
取消