猿问

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

以下几段代码,输出的结果不一样。希望有大神可以解答一下原理,谢谢!


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());


最后还是要感谢一下,好心人帮忙解答问题,万分感谢!


云淡风轻的天空
浏览 1239回答 1
1回答

stone310

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());
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答