论坛首页 Web前端技术论坛

关于js作用域的疑惑

浏览 11613 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-01-02  
楼主看看,某大牛写的《javascript core》吧,局部作用域链和其他的,书里说的很清楚
0 请登录后投票
   发表时间:2012-01-03  
黑白两相望 写道
 
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 请登录后投票
   发表时间:2012-01-04  
waitingmyself 写道
楼主说的有问题吧  2处应该是 abc

是你错了。楼主说的没错,2处确实是underfind,因为下面有一个又定义了一次name。程序在执行的时候,会先执行var name,然后再执行name="def",所以这个时候alert(name)的时候它是underfind的。
0 请登录后投票
   发表时间:2012-01-04  
学到了,受教
0 请登录后投票
   发表时间:2012-01-04   最后修改: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 请登录后投票
   发表时间:2012-01-05  
jefbx 写道
你写的testGlobal(); 相当于window.testGlobal() 所以this为window; 1处的就不解释了; 2处的原因在于你在testGlobal里面应用了 var name 这样name就是局部变量,覆盖了全局的name,  js在函数执行前会扫描局部变量,相当于在函数的最开头写了一个var name, 所以执行到2处时,name虽然声明了,但没有赋值,就是undefined了,当执行到3处时,name已经被赋值了;4处的name是全局的name;6处的原因在于testGlobal函数修改了全局的name变量(this.name, this即window, 全局变量都是window的属性),



正解
0 请登录后投票
   发表时间:2012-01-05  
<SCRIPT LANGUAGE="JavaScript">
	<!--
		
		var name = "abc";
		function testGlobal(){
			this.name = "123";
			return this;
		}
		
		alert(testGlobal().name);
		alert(new testGlobal().name);

	//-->
	</SCRIPT>

这里的在直接调用testGlobal()中的this  和 new Global()中得this,有什么不同,编译器怎么解析的?求大牛解惑
0 请登录后投票
   发表时间:2012-01-05  
weilingfeng98 写道
<SCRIPT LANGUAGE="JavaScript">
	<!--
		
		var name = "abc";
		function testGlobal(){
			this.name = "123";
			return this;
		}
		
		alert(testGlobal().name);
		alert(new testGlobal().name);

	//-->
	</SCRIPT>

这里的在直接调用testGlobal()中的this  和 new Global()中得this,有什么不同,编译器怎么解析的?求大牛解惑

直接调用  this指的是调用者 这里是window。
new  在function中会先创建一个对象,然后this指向新创建的对象,然后执行function的内容,最后返回创建的对象。
0 请登录后投票
   发表时间:2012-01-08  
如果函数里面有变量和全局变量同名
js认为这个变量在函数里
所有2处是undefined
0 请登录后投票
   发表时间:2012-01-09  
搞不清楚你是做研究还是做项目。

如果是做项目,我只能说你名字不好好取,干嘛非得要取一样的变量名?
为了显示你的功力深厚么?做项目的代码要写的简单易懂,你要保证后续维护人员能轻易看懂,也要保证以后的你能看懂。
0 请登录后投票
论坛首页 Web前端技术版

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