1.在js代码从上到下执行之前,浏览器首先会把所有带var 和 function关键字的进行提前的声明或者定义;
声明(declare):相当于种树时候"挖坑" var num;(var 一个变量) 只声明没有定义的时候,num的默认值是undefined
定义(defined):相当于种树时候"栽树" num=12;(给变量赋值)
在预解释的时候,带var和带function的还不一样:
var:只是提前的声明(定义赋值的部分是在代码执行的时候完成的)
function:提前的声明+定义
在预解释的时候不管条件是否成立判断体中的代码都要进行预解释
在全局作用域下 num=12的意思是给window这个浏览器对象增加一个叫做num的属性名,属性值是12-->window.num=12;
var num=12; 在全局作用域(window)下,这样的也相当于给window定义了一个叫做num的属性,属性值是12
区别:带var的可以在代码执行之前进行预解释(提前声明),而不带var的不可以;
带function关键字的在预解释的时候就完成了声明和定义,当代码执行到函数定义那部分的时候,直接的跳过即可(不在重新的处理)
在js中作用域只有两种 window全局作用域、函数执行形成的私有作用域
在window下定义的变量叫做全局变量,在私有作用域中定义的变量叫做私有变量
在函数执行的时候会形成一个私有作用域,首先是给形参赋值,接下来进行预解释,完成后私有作用域下的代码从上到下开始执行
在私有作用域中出现的变量,首先看是否为私有变量,如果是私有变量,那么函数中用的都是私有变量,否则则向上一级找。
请分析下面的代码:
var a = 12;
function fn() {
var a = 13;
function f() {
console.log(a);
}
return f;
}
function sum() {
var a = 14;
var f = fn();
f();
}
sum();
最后输出的结果为13;你分析对了么?
原文:http://www.cnblogs.com/haibinboke/p/5314234.html