本文实例为大家深度剖析JS的作用域,代码注释详细,供大家参考,具体内容如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>作用域问题</title> </head> <body> <script> /* * 1.全局变量与局部变量 * 外层变量可以在内层调用(全局),内层变量不能在外层调用(局部) * */ var a = 1; (function () { // 外部变量可以在内部调用 alert(a); })(); /*function test() { // 内部变量不能在外部调用 var a = 2; } alert(a); // 报错*/ /* * 下面举个例子: * 函数调用只是回到函数定义的地方,调用一下函数 * 这里在bbb函数中,调用aaa函数, * 这时的aaa函数并不是被放入bbb函数中,而是在原定义的地方 * 这是的aaa中没有变量a,所以去访问全局变量中的a * */ /*var a = 10; function aaa() { alert(a); } function bbb() { var a = 20; aaa(); } bbb(); // 10*/ /* * 2.当var不加的时候,会自动变成全局变量 * 在全局环境中,不加var和加var效果一样,都是全局变量 * 在局域环境中,加var会被定义为局部变量,不加var会被定义为全局变量 * */ /*function test() { var a = 10; // 外部访问不到 b = 10; // 相当于全局变量 // 上面相当于:var a = b = 10; } test(); alert(b); // 10 alert(a); // 报错*/ /* * 3.变量查找按照就近原则去查找 * var定义的变量,当就近查找没有找到就去外层查找 * */ /*var a = 10; (function() { var a = 20; // a在匿名函数中var定义了,所以找到为20 alert(a); // 20 })();*/ /*var a = 10; (function() { a = 20; // 相当于全局变量,将外部的var a = 20; // 在匿名函数中没有找到var定义的a,然后去外层去查找 // 外部查找到了,var a = 10 = 20; alert(a); // 20 })();*/ /*var a = 10; (function() { // 在匿名函数中没有找到var定义的a,然后去外层去查找 // 外部查找到了,var a = 10 alert(a); // 10 a = 20; })();*/ /*var a = 10; (function() { // 在匿名函数中找到var定义的a, // 这里的var a = 20,存在变量提升, // 在执行alert(a)之前,变量提示有var a; // 但是a没有值,所有返回undefined alert(a); // undefined var a = 20; // 在变量提升的情况下,相当于下面: // var a; // alert(a); // a = 20; })(;*/ /*var a = 10; (function() { // 执行bbb,bbb中的a=20,但是与匿名函数和全局变量a无关 bbb(); // 在匿名函数中查找var定义的a,发现没有 // 继续在外层中查找,发现了 var a = 10; alert(a); // 10 function bbb() { var a = 20; } })();*/ /* var a = 10; (function() { bbb(); // 在匿名函数中查找var定义的a,发现没有 // 继续在外层中查找,发现了 var a = 10 = 20; alert(a); // 20 function bbb() { // 没有var定义,所有为全局变量,外面的全局变量 var a = 10 = 20; a = 20; } })();*/ /* * 当参数与局部变量重名时,优先级等同 * */ /*var a = 10; (function (a) { // 这里的参数a是基本类型,按值传参的 // 相当于在匿名函数内部重新定义了一个a, // 且与外层的a不相关 a += 3; })(a); alert(a); // 10*/ /*var a = [1,2,3]; (function (a) { // 这里的参数a是特殊类型,按引用传参的 // 相当于在匿名函数内部重新定义了一个a, // 但是这个a是外层a的一个别名,它们引用了同一个地址 // 所以内部a添加值,外部a可以访问到 a.push(4); })(a); alert(a); // [1,2,3,4]*/ /*var a = [1,2,3]; (function (a) { // 这里的参数a是特殊类型,按引用传参的 // 相当于在匿名函数内部重新定义了一个a, // 但是这个a是外层a的一个别名,它们引用了同一个地址 // 所以内部a添加值,外部a可以访问到 // 但是,这里的a又重新赋值了新的数组,断开了与外层的关系 a = [1,2,3,4]; })(a); alert(a); // [1,2,3]*/ </script> </body> </html>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍JS 作用域与作用域链详解,包括了JS 作用域与作用域链详解的使用技巧和注意事项,需要的朋友参考一下 (1)作用域 一个变量的作用域(scope)是程序源代码中定义的这个变量的区域。 1. 在JS中使用的是词法作用域(lexical scope) 不在任何函数内声明的变量(函数内省略var的也算全局)称作全局变量(global scope) 在函数内声明的变量具有函数作用域(func
本文向大家介绍深入理解js函数的作用域与this指向,包括了深入理解js函数的作用域与this指向的使用技巧和注意事项,需要的朋友参考一下 函数的作用域与this指向是js中很重要的一部分,理清这点东西需要个逻辑,看看我的逻辑怎么样... 下面是个提纲,可以直接挑你感兴趣的条目阅读。 • 函数的定义方式:直接定义(window下,内部定义),对象的方法,对象原型的方法; • 函数的调用方式:直接调
本文向大家介绍JS中作用域和变量提升(hoisting)的深入理解,包括了JS中作用域和变量提升(hoisting)的深入理解的使用技巧和注意事项,需要的朋友参考一下 作用域(Scoping) 对于Javascript初学者来说,一个最迷惑的地方就是作用域;事实上,不光是初学者。我就见过一些有经验的javascript程序员,但他们对scope理解不深。javascript作用域之所以迷惑,是因为
本文向大家介绍Python中作用域的深入讲解,包括了Python中作用域的深入讲解的使用技巧和注意事项,需要的朋友参考一下 前言 作用域是指变量的生效范围,例如本地变量、全局变量描述的就是不同的生效范围。 python的变量作用域的规则非常简单,可以说是所有语言中最直观、最容易理解的作用域。 在开始介绍作用域之前,先抛一个问题: 上面的代码将输出3、1、1。解释参见再述作用域规则。另外,个人建议,
本文向大家介绍详解js的作用域、预解析机制,包括了详解js的作用域、预解析机制的使用技巧和注意事项,需要的朋友参考一下 虽然,ES6在我们工作中应用得越来越广泛,但是还是很多项目保留着ES5的写法,所以,今天,带着大家重新巩固下ES5下的作用域及预解析机制。 概念: 作用域:域,指的是一个空间、范围、区域,作用指的是在域内可进行读写操作。一个变量的作用域是程序源代码中定义的这个变量的区域。 在ES
本文向大家介绍深入理解Javascript中this的作用域,包括了深入理解Javascript中this的作用域的使用技巧和注意事项,需要的朋友参考一下 大家在使用Javascript的时候经常被this这个家伙搞得晕头转向的。对大多数有OOP开发经验的开发人员来说this是当前作用域中引用普通元素的标识符,但是在Javascript中它却显得古灵精怪的,因为它不是固定不变的,而是随着它的执行环