js作用域问题一步步透彻理解

原文:js作用域问题一步步透彻理解

黄金守则第一条:

    js没有块级作用域(你可以自己闭包或其他方法实现),只有函数级作用域,函数外面的变量函数里面可以找到,函数里面的变量外面找不到。

   first try:

  

  这是为什么呢??

 

 1 var a = 10;
 2         function aaa(){//step-4
 3             alert(a);//step-5->执行alert,此时只能找到外面的a=10故弹框10
 4         }
 5         function bbb(){//step-2
 6             var a = 20;
 7             aaa();//step-3
 8         }
 9         //定义了函数没啥用,调用才是真格的所以这里是step-1
10         bbb();//step-1

 

其实原理大家都懂,应该就是易错而已,万变不离其综。

 

 second try:

这是为什么呢? 因为给a赋值b的时候,b还没有定义,所以a是undefined,b是10.

 

黄金守则第二条:

   变量的查找是就近原则,去寻找var定义的变量,当就近没有找到的时候就去查找外层。

look:

  

 

这是为什么呢、? 这里面有两个原因,一是预解析,二是就近查找。

 

 1         var a=10;
 2         function aaa(){
 3             alert(a);//undefined,查找a的时候会现在函数内查找,由于预解析的作用,此时的a是undefined,因此永远不会去查找外面的10了
 4             var a = 20;
 5
 6             /*预解析
 7             var a
 8             alert(a);
 9             var a = 20;*/
10
11         }
12         aaa();

 

attention:

 

这个吧,就验证了第二条,虽然是就近原则,但是是就近找var声明的变量,这个是因为没有var声明的变量是全局的,这里只是修改了a的值。所以上面就是因为在函数内没找到var的a,于是到外面去找了,一找就找到了,于是a就alert出10了;不过没错的是a=20后,a确实为20了,只不过alert的时候还没有执行到那~~

看吧~

 

下面这个例子,更加验证了js的函数作用域 而已:

这是因为在alert(a)的时候,bbb函数中的a确实为20 ,可是它对于这时的alert(a)这句话来说是局部的,alert(a)根本找不到bbb函数中的a,所以在aaa函数中它找不到a,于是乎去外面找,一找,就找到了10。

 

 

黄金守则第三条:

    当参数跟局部变量重名时,优先级是等同的。

 

例:

 

 还有:传参时,基本类型传值,引用类型传引用。(但是重新赋值之后就不是这样了喔)

1         var a = 5;
2         var b = a;
3         b +=3;
4         alert(a);//5
5
6         var a = [1,2,3];
7         var b=a;
8         b.push(4);
9         alert(a);//[1,2,3,4];

上面代码没有问题,但是下面就不一样啦。

 

 

因为b被重新赋值了,不指向a了。

 

此外,参数与变量的作用域是相似的:

对比上下这两个:

上面是参数是基本类型,只传了值进去,下面的传个引用类型:(同样也包含重新赋值的情况)

 

 

时间: 2024-10-26 12:13:50

js作用域问题一步步透彻理解的相关文章

js作用域及作用域链概念理解及使用_基础知识

(1)作用域 一个变量的作用域(scope)是程序源代码中定义的这个变量的区域. 1. 在JS中使用的是词法作用域(lexical scope) 不在任何函数内声明的变量(函数内省略var的也算全局)称作全局变量(global scope) 在函数内声明的变量具有函数作用域(function scope),属于局部变量 局部变量优先级高于全局变量 var name="one"; function test(){ var name="two"; console.log

js作用域使用方法说明

一个面试题以它来详细介绍js作用域  代码如下 复制代码 function foo(){  foo.abc = function(){alert('Alibaba')}  this.abc = function(){alert('Alimama')}  abc = function(){alert('Alipay')};  var abc = function(){alert('Taobao')} } foo.prototype.abc = function(){alert('Alisoft')

对于js作用域不是很了解

问题描述 对于js作用域不是很了解 对于js作用域还不是很了解,从上到下和从里到外是什么样的,怎样做到从外到里呢? 解决方案 参考:http://blog.csdn.net/yueguanghaidao/article/details/9568071 解决方案二: javascript运行机制浅析JavaScript的闭包和作用域链

JS原型、原型链深入理解_javascript技巧

原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有"prototype"属性,函数对象有"prototype"属性,原型对象有"constructor"属性. 一.初识原型在JavaScript中,原型也是一个对象,通过原型可以实现对象的属性继承,JavaScript的对象中都包含了一个"[[Prototype]]"内部属性,这个属性所对应的就是该对象的原型. "[[Prototype]

JS作用域闭包、预解释和this关键字综合实例解析_javascript技巧

本文实例分析了JS作用域闭包.预解释和this关键字.分享给大家供大家参考,具体如下: var number = 2; var obj = {number : 5, fn1 : ( function() { this.number *= 2; number=number*2; var number=3; return function() { this.number *= 2; number*=3; alert(number); } } )() }; var fn1 = obj.fn1; ale

JS编程建议——78:正确理解执行上下文和作用域链

建议78:正确理解执行上下文和作用域链执行上下文(execution context)是ECMAScript规范中用来描述 JavaScript 代码执行的抽象概念.所有的 JavaScript 代码都是在某个执行上下文中运行的.在当前执行上下文中调用 function会进入一个新的执行上下文.该function调用结束后会返回到原来的执行上下文中.如果function在调用过程中抛出异常,并且没有将其捕获,有可能从多个执行上下文中退出.在function调用过程中,也可能调用其他的functi

js中的闭包之我理解

闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的理解以及js内部解释器的运作 方式的描述,都是可以看出你js实际水平的.即使你没答对,也能让考官对你的水平有个评估.那么我先来说说我对js中的闭包的理解. 闭包是很多语言都具备的特性,在js中,闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等. 在理解闭包以前.最好

JS 作用域与作用域链详解_基础知识

(1)作用域 一个变量的作用域(scope)是程序源代码中定义的这个变量的区域. 1. 在JS中使用的是词法作用域(lexical scope) 不在任何函数内声明的变量(函数内省略var的也算全局)称作全局变量(global scope) 在函数内声明的变量具有函数作用域(function scope),属于局部变量 局部变量优先级高于全局变量 复制代码 代码如下: var name="one"; function test(){   var name="two"

js 作用域链&内存回收&变量&闭包

闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等 一.作用域链:函数在定义的时候创建的,用于寻找使用到的变量的 值的一个索引,而他内部的规则是,把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高一级函数中的变量放在更后面,以此类推直至 全局对象为止.当函数中需要查询一个变量的值的时候,js解释器会去作用域链去查找,从最前面的本地变量中先找,如果没有找到对应的变量,则到下一级的链 上找,一旦找到了变量,则不再继续.如果找到最后也没找到需要的变