Javascr ipt的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部:
'use strict';
function foo() {
var x = 'Hello, ' + y;
alert(x);
var y = 'Bob';
}
foo();
虽然是strict模式,但语句var x = ‘Hello, ‘ + y;并不报错,原因是变量y在稍后申明了。但是alert显示Hello, undefined,说明变量y的值为undefined。这正
一.var 声明与变量提升机制
在Javascr ipt中使用var定义一个变量,无论是定义在全局作用域函数函数的局部作用域中,都会被提升到其作用域的顶部,这也是Javascr ipt定义变量的一个令人困惑的地方。由于es5没有像其它类C语言一样的块级作用域,因此es6增加了let定义变量,用来创建块级作用域。
我们来看一个var定义变量的示例:
function setName(){
if(condition){
var name = 'loho';
console.
一、变量 •全局变量 Javascr ipt的两个特征,不自觉地创建出全局变量是出乎意料的容易。首先,你可以甚至不需要声明就可以使用变量;第二,Javascr ipt有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性(不是真正意义上的全局变量,可以用delete删除) 代码如下: function sum(x,y) { // result 未声明,为隐式全局变量 result = x + y; return result; } function foo() { // 使用任务链
作用域
作用域是一个变量和函数的作用范围,javascr ipt中函数内声明的所有变量在函数体内始终是可见的,在javascr ipt中有全局作用域和局部作用域,但是没有块级作用域,局部变量的优先级高于全局变量,通过几个示例来了解下javascr ipt中作用域的那些“潜规则”(这些也是在前端面试中经常问到的问题)。
1. 变量声明提前
示例1:
var scope="global";
function scopeTest(){
console.log(scope);
var sco