`
fang9159
  • 浏览: 48120 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
社区版块
存档分类
最新评论

谈谈对js作用域的理解与疑问,请各位指正。

阅读更多
近来看了nicholas写的《javascript 高级程序设计》这本书,在讲到下列内容

这是原文: “当代码在一个环境中执行时,会创建由变量对象构成的一个作用域链。”

通过原文的意思是:如果有一个function, 只有当这个function被调用时,它才会在这个function创建一个作用域链。

比如这个例子
function test() {
  var  s = 66;
      function sub() {

           alert(s);
      };
      sub();
}
test();
这里会打印  66;
如果就书上所写的,是在函数调用时就创建作用域,当test()执行时,则会为test创建一个作用域链,但test内部又有一个sub函数,并且也执行了sub,即又为这个sub的环境里也创建了一个作用域链, sub的作用域在test执行环境里寻找到了s变量, 故打印了66.
销毁过程:
先销毁了sub(包括了 sub的作用域)
当test里面的变量没有被sub引用时,则接着销毁了test();
这是我目前的理解。

接着,我们将例子改一下。
function test() {
  var  s = 66;
      function sub() {

           alert(s);
      };
}
test();
这个例子与上面例子不同的时。 sub没有执行,则按照上面的理解。sub的作用域根本没有创建出来, 即这里只是声明了一个sub函数, test()执行完后,变量s与sub函数都会被销毁掉。
我们再将这个例子改一下
function test() {
  var  s = 66;
      setTimeout(function sub() {

           alert(s);
      },1000);
}
test();
这里还会1秒钟后打印66.  但sub是在1秒钟后才执行, 即在1秒后才建立作用域,但这里有个问题 ,test执行完后,应该检查到s变量没有被引用到时,则会被销毁掉,那一秒钟后 s 应该是undefined. 但这里为什么可以打印66呢?

所以讲到这里 ,可能是作用域并不是在函数调用时才创建的,应该是函数在创建时就创建了,即function a() {},就会由作用域,而不是等a()才有作用域,只有这样理解第三个例子才会讲得通。 但这个书也不应该写错啊, 所以这个疑问 ,希望有人能帮我回答 。谢谢。
分享到:
评论

相关推荐

    javascript执行环境,作用域理解

    JavaScript 执行环境和作用域的深层次理解 在 JavaScript 中,执行环境和作用域是两个非常重要和基本的概念,理解了这两个概念对于 JavaScript 中很多脚本的运行结果就能明白其中的道理了。执行环境是一个概念,一...

    深入理解JavaScript作用域和作用域链

    JavaScript作用域是编程中至关重要的...在实际编程中,我们还会遇到闭包、块级作用域(ES6中的`let`和`const`)等更高级的概念,这些都是基于作用域链的扩展,理解它们对于成为精通JavaScript的开发者来说必不可少。

    javascript变量作用域

    了解 JavaScript 变量作用域的规则非常重要,因为它可以帮助我们更好地理解和使用 JavaScript 语言。同时,了解变量作用域的规则也可以帮助我们避免一些常见的错误和问题。 在实际开发中,了解变量作用域的规则可以...

    深化理解javascript作用域其次篇之词法作用域和动态作用域_.docx

    理解词法作用域和动态作用域对javascript的编程至关重要。本文将详细介绍词法作用域和动态作用域的概念、特征和应用。 词法作用域 词法作用域是javascript中一种静态作用域机制,它的定义过程发生在代码的编写阶段...

    理解JavaScript作用域和作用域链

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。任何程序...

    js变量作用域

    #### 二、全局变量与作用域划分 ##### 1. 全局变量 在JavaScript中,全局变量实际上是`window`对象的一个属性。例如,如果在一个脚本文件或全局作用域中声明了一个变量,没有使用`var`、`let`或`const`关键词,则...

    深入理解变量作用域

    ### 深入理解变量作用域 #### 一、引言 在JavaScript编程语言中,作用域是一个核心概念,它决定了变量的可见性和生命周期。作用域不仅影响着代码的执行效率,更是解决bug的关键所在。本文将从JavaScript权威指南...

    深入理解JavaScript作用域共12页.pdf.zip

    本资料"深入理解JavaScript作用域共12页.pdf"将详细探讨这一主题。 在JavaScript中,作用域主要有两种类型:全局作用域和局部作用域。全局作用域的变量在整个脚本中都是可访问的,而局部作用域的变量只在其声明的...

    JavaScript作用域原理

    闭包是JavaScript中的另一个与作用域相关的概念。闭包是指函数能够记住并访问其词法作用域,即使在其父函数已经执行完毕后。这种能力使得闭包可以用来实现数据隐藏、模块化和内存管理等高级功能。 理解JavaScript的...

    05-JavaScript作用域.pdf

    从以上内容可以看出,JavaScript作用域的设计对程序的可维护性和变量的安全性起着关键作用。正确理解和运用作用域,能够有效地控制变量的作用范围和生命周期,同时减少全局变量的使用,避免潜在的命名冲突和安全问题...

    JS的作用域与闭包

    #### 二、作用域的定义与作用 **作用域**是一组明确的规则,它决定了如何存储变量以及如何在之后找到这些变量。在程序设计中,作用域非常重要,因为它定义了变量的生命周期以及它们可以在何处被访问。 **作用域的...

    作用域初理解1

    运行时,JS引擎会在作用域链中查找变量`a`,并对其进行赋值。 编译器的工作包括词法分析和解析。词法分析将源代码分解成有意义的词法单元(tokens),如关键字、标识符和符号。接着,解析器将这些tokens转换成抽象...

    理解JavaScript变量作用域.pdf

    理解JavaScript变量作用域.pdf 本人还有几十本经典javascript书籍以及无数javascript资料,要的加我qq 568094881,本人网址:www.maoshanhai.com

    深入理解JavaScript作用域.pdf

    深入理解JavaScript作用域

    js作用域基本介绍.doc

    4. **闭包与作用域** 当函数内部引用了外部作用域的变量,即使外部函数已经执行完毕,其作用域仍然会被保留,形成闭包。闭包使得内部函数能够访问并操作外部作用域的变量,即使外部函数已经结束。 5. **块级作用...

    深入理解javascript作用域第二篇之词法作用域和动态作用域

    6. **this机制**:虽然`this`的绑定与作用域无关,但它经常与作用域混淆,因为两者都会在函数执行时产生影响。`this`的值取决于函数调用方式,而不是函数声明位置。 相比之下,动态作用域(也称为基于调用的或LEGB...

Global site tag (gtag.js) - Google Analytics