论坛首页 Web前端技术论坛

关于js作用域的疑惑

浏览 11612 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-12-30  
	var name = "abc"
	function testGlobal() {
		alert(name); //2处:undefined
		var name = "def";
		alert(name); //3处:def
		
		alert(this.name); //4处:abc
		
		this. name = "ghi";
		alert(this.name); //5处:ghi
	}
	alert(name); //1处:abc
	
	testGlobal();
	
	alert(name); //6处:ghi

如上面的代码,在这里发帖,主要是个人觉得这个版块要比问答版块的活跃,function中的this为什么指的是widow对象,还有其他的几处具体是怎么来的,我已经作了标记,那几处的原因?
求大牛解释!
   发表时间:2011-12-30  
额,咋 没 有 人 回 复?
0 请登录后投票
   发表时间:2011-12-30  
"this" is a keyword not a property of any object, that refer to one object depending on the scope. In the global scope, it refers to the window object. In the function scope it refers to the object that has the function as its property    当一个函数不作为其它对象的属性时,默认this引用window
0 请登录后投票
   发表时间:2011-12-30  
额……怎么人这么少?
0 请登录后投票
   发表时间:2011-12-30  
楼主说的有问题吧  2处应该是 abc
0 请登录后投票
   发表时间:2011-12-31   最后修改:2012-01-04
 
var name = "abc";

// js会有一个预解析的过程,先执行函数里的变量声明,但不执行赋值
function testGlobal() {
    // 所以这里查找变量的时候,搜索到函数里的name
    // 此时有name的声明,就是下面那个,但是并没有执行赋值
    // 所以是undefined
    alert(name); //2处:undefined  
    var name = "def"; 
    // 这里调用这个函数的时候,上面的赋值语句已经执行
    // 所以是def
    alert(name); //3处:def  
    // this - 谁调用指向谁
    // js里方法和对象是松散的耦合
    // 多数情况下函数可以随意得绑定到别的对象上去运行
    alert(this.name); //4处:abc  
    
    this. name = "ghi";  
    alert(this.name); //5处:ghi
}
// 搜索变量找到全局作用域的 name
alert(name); //1处:abc  
// window直接调用这个方法
testGlobal();  
// 函数里this. name = "ghi"; 经过上面的函数执行实际是window.name='ghi';
alert(name); //6处:ghi
0 请登录后投票
   发表时间:2011-12-31  
// this - 谁调用指向谁 
testGlobal() ,完整的写应该是window.testGlobal();
0 请登录后投票
   发表时间:2011-12-31   最后修改:2011-12-31
waitingmyself 写道
楼主说的有问题吧  2处应该是 abc


然也

啊!不对,弄错了,如果情况如下,2处应该是abc
var name = "abc"  
function testGlobal() {  
    alert(name); //2处:abc  
    name = "def";  
    
}  
testGlobal();  


0 请登录后投票
   发表时间:2011-12-31  
恩,如果函数内变量如果有声明的话那么此变量跟外部变量没什么关系
0 请登录后投票
   发表时间:2011-12-31  
方法内的this就是window,由于在方法外声明了name 实际this.name = 'ghi' 就想到与将方法外的name值修改了
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics