`

JS变量的声明被提前到作用域顶部,赋值则保留在原地

 
阅读更多

JS变量的声明被提前到作用域顶部,赋值保留在原地;(不要小看这句总结)请看下面这个例子:

var color = "blue";
function getColor()
{
	console.log(color);   // undefined
	var color = "red";
	return color;
}
console.log(getColor());  // red

    可能你已经掌握了局部作用域会覆盖上一级作用域的同名变量。然后Line4的color先使用上一级作用域的color,所以误认为值是blue。其实不是,原因就在于,JS变量的声明(var修饰)会被提前到函数作用域的开始处,即相当于Line5的var color="red";被分解成var color; color="red";而var color先被JS引擎解析,覆盖了上一级的color,接着执行Line4的输出,此时color没有被赋值,赋值color="red";依然保留在Line5处。

    这个细节,告诉我们,不能只知其一不知其二。(上面的代码大概引自《JavaScript高级程序设计》)

    ♣特别是函数:

    代码1:

alert(sum(1,1));//2
function sum(a,b){
	return a+b;
}

 

    代码2:

    

alert(sum(1,1));  // 报错
var sum = function (a,b){
	return a+b;
}

 

-------------------------------------------------

另外一个比较生动的参考是:

[1]Javascript:谈谈JS的全局变量跟局部变量 - 刀刀的专栏 - 博客频道 - CSDN.NET 

http://blog.csdn.net/zyz511919766/article/details/7276089 

    

分享到:
评论

相关推荐

    JavaScript作用域原理(二) 预编译[9 29]

    然而,值得注意的是,只有声明被提升了,赋值操作仍然留在原地。 例如: ```javascript console.log(x); // undefined var x = 5; ``` 在这个例子中,`var x`被提升到顶部,但`x = 5`的赋值操作保持原位。因此,在`...

    javascript函数作用域学习示例(js作用域)

    看起来好像`globals`函数内的`global`变量覆盖了全局的`global`变量,但实际上,变量声明被提升到了函数的顶部,但是赋值操作保持原地,所以第一次`alert`输出`undefined`,因为在执行到`var global`之前,局部变量`...

    JS声明变量背后的编译原理剖析

    这是因为变量声明被提升到了函数体的顶部,而变量的赋值语句仍保留在原来的位置。 以文章中的代码为例,我们用var声明变量x,并在函数y中引用和修改x。根据变量提升机制,代码在执行前会被编译器处理为: ```...

    浅谈js中的变量名和函数名重名

    预解析是JavaScript引擎在代码实际执行前进行的一种优化行为,它会将函数声明和变量声明提升到它们所在的作用域顶部。但值得注意的是,虽然声明被提升了,赋值操作则仍然保持在原位置。 1. 函数声明会被置顶:这...

    javascript 函数及作用域总结介绍

    这意味着在函数或全局作用域顶部声明的变量可以在声明之前被引用,但其值将是undefined,直到赋值操作执行。 最后,我们还需要注意变量和函数命名冲突的问题。在JavaScript中,如果同一个作用域内存在同名的函数和...

    JAVASCRIPT函数作用域和提前声明 分享

    这是因为变量`test1`的声明被提升了到函数顶部,但赋值操作仍然保持原地。所以函数内部的行为相当于: ```javascript var test1 = "globalVariable"; function test() { var test1; // 声明提前 console.log(test...

    JavaScript中提前声明变量或函数例子

    在JavaScript中,使用`var`关键字声明的变量会被提升到其所在的作用域顶部,但赋值操作不会被提升。以下是一些示例: ```javascript console.log(name); // 输出 "undefined",而不是错误 var name = "xiaoming"; `...

    JS+DOM.doc

    变量的声明在执行前会被提升到当前作用域的顶部,但赋值操作保持原地不变。 JS中的数据类型分为两大类:原始类型(Primitive Types)和引用类型(Reference Types)。原始类型包括Number、String、Boolean、...

    Javascript全局变量var与不var的区别深入解析

    相反,非`var`声明的全局变量不会被提升,它们的声明不会移动到作用域顶部,而是保持在原地。因此,如果你在声明之前试图访问它们,会引发引用错误。 ```javascript alert(a); // 抛出错误,因为 a 未定义 a = ...

    js进阶知识44张脑图.zip

    - 在JavaScript中,变量声明会被提升到当前作用域的顶部,而赋值操作则保持在原地。这意味着无论变量在哪里声明,它都会在作用域内的任何位置被识别,但其初始值可能为undefined。 2. **柯里化(Currying)**: -...

    浅谈js script标签中的预解析

    预解析会将变量`numOne`的声明提升到第一个作用域的顶部,而它的赋值仍然保留在原地。因此,在第一个`<script>`标签中,`numOne`是未定义的,而在第二个`<script>`标签中,它被赋予了10的值。 函数声明也同样受到预...

    JavaScript提升机制Hoisting详解

    `name`变量在控制台打印出`undefined`,而不是抛出错误,是因为`var name`的声明在编译阶段已经被提升到作用域顶部,而`name = 'tom'`的赋值则留在原地,在执行阶段进行。 对于函数声明,提升机制同样适用: ```...

    一个挺有意思的Javascript小问题说明

    这意味着无论变量在哪一行被声明,都会被提升到它所在的作用域顶部。然而,赋值操作则保持在原地。这就引出了我们讨论的三段代码: 1. 首段代码展示了全局变量`firstName`的使用,由于没有在函数内部声明,因此在`...

    深入解读JavaScript中的Hoisting机制

    当JavaScript引擎解析代码时,它会将所有的变量声明(`var`)和函数声明(`function`)提升到它们所在作用域的顶部。这种行为使得开发者在代码的任何位置使用这些变量和函数,仿佛它们在该作用域的开头已经被声明。 ...

    javascript 两种声明函数的方式的分析

    这是因为JavaScript在解析阶段会将函数声明提升到其所在的作用域顶部。这就是所谓的"函数提升"(function hoisting)。 3. **区别分析** - **先声明后使用 vs 先使用后声明** 函数表达式需要在调用前被定义,否则...

    ES6学习笔记之let与const用法实例分析

    - `var` 声明的变量会被提升到其所在作用域的顶部,即使在声明之前使用也不会报错,但只会提升声明,不提升赋值。而 `let` 和 `const` 不会进行变量提升,这意味着在声明之前使用会抛出错误。 - 示例:在 `var` ...

    极易被忽视的javascript面试题七问七答

    1. 变量定义提升(Hoisting):在JavaScript中,变量声明(`var`,`let`,`const`)和函数声明会被提升到它们所在的作用域顶部。但需要注意的是,只有声明被提升,赋值操作则保持在原地。因此,即使函数在代码的后面...

    js-pitfall-examples:常见的 JavaScript 陷阱示例

    在JavaScript中,变量声明会被提升到它们所在的作用域顶部。这意味着即使在声明变量之后使用,它们也不会抛出错误。然而,赋值操作不会被提升,这可能导致混淆。 示例: ```javascript console.log(x); // ...

Global site tag (gtag.js) - Google Analytics