标签:
几天没有更新,这两天使周末,给大家整理了一几篇东西,有关于作用域的,闭包的,还有递归的,闭包和递归,对于大部分初次接触编程的人来说还是有些难度的,昨天,花了一点时间给大家整理了一下,今天,给大家上传上来,让大家看看,部分属于个人观点,如有错误,欢迎指出
这一篇先给大家讲一讲词法作用域吧,但是讲之前我们需要先讲一讲变量名提升。
var num = 123;
function foo1 () {
console.log( num ); //undefined
var num = 456;
console.log( num ); //456
}
foo1();
程序在执行过程,会先将代码读取到内存中检查,会将所有的声明在此时进行标记。所谓的标记就是 让 JS 解析器中有这个名字,后面在使用名字的时候,不会出现未定义的错误,这个标记过程就是提升。
声明:
function f() {
function func() {
} // 声明
if ( true ) {
function func2() {} // 函数表达式
}
var f = function func3 () {}; // 函数表达式
this.sayHello = function () {}; // 函数表达式
var i = 1;
function func4 () {} // 函数声明
var j = 2;
}
例:
var num = 1;
function num () {
alert( num );
}
num();
分析:
例1:
var num = 123;
function foo1 () {
console.log( num );
var num = 456;
console.log( num );
}
foo1();
例2:
if ( ! ‘a‘ in window ) {
var a = 123;
}
console.log( a );
例3:
if ( true ) {
function f1 () {
console.log( ‘true‘ );
}
} else {
function f1 () {
console.log( ‘false‘ );
}
}
f1();
老版本浏览器解析
执行代码, 第一句话就是有一个 空的 if 结构
if ( true ) {
} else {
}
新版本浏览器解析
问题: function foo() {} var foo = function () {}; 之间的不同之处???
var foo = function func () {
};
func();
新的浏览器中, 写在 if, while, do-while 结构中的函数, 都会将函数的声明转换成 特殊的函数表达式 将代码
if (...) {
function foo () { ... }
}
转换成
if (...) {
var foo = function foo () { ... }
}
域表示的就是 范围, 即 作用范围. 就是一个名字在什么地方可以被使用, 什么时候不能使用.
即块级的作用范围
// 在 C , Java 等编程语言中, 下面的语法报错
{
var num = 123; // int
{
console.log( num ); // => 123
}
}
console.log( num ); // 报错
所谓的词法(代码)作用域,就是代码在编写过程中体现出来的作用范围,代码一旦写好,不用执行 作用的范围就已经确定好了,这个就是所谓的词法作用域
在JS中才发作用域规则
例子1:
var num = 123;
function foo() {
console.log( num );
}
foo();
例子2:
if ( false ) {
var num = 123;
}
console.log( num ); // undefiend
例子3:
var num = 123;
function foo() {
var num = 456;
function func() {
console.log( num );
}
func();
}
foo(); //456
例子4:
var num1 = 123;
function foo1() {
var num1 = 456;
function foo2() {
num1 = 789;
function foo3 () {
console.log( num1 );
}
foo3();
}
foo2();
}
foo1(); // 789
console.log( num1 ); // 123 //789会覆盖foo1中的num1,但是全局中的num1没有变化,所以还是123
可以发现只有函数可以制造作用域结构. 那么只要是代码, 至少有一个作用域, 即全局作用域. 凡是代码中有函数, 那么这个函数就构成另一个作用域. 如果函数中还有函数, 那么再这个作用域中就 又可以诞生一个作用域. 那么将这样的所有的作用域列出来, 可以有一个结构: 函数内指向函数外的链式结构.
例如:
function f1() {
function f2() {
}
}
var num = 456;
function f3() {
function f4() {
}
}
变量的访问规则
例子:
var num = 123;
function f1() {
console.log( num );
}
function f2() {
var num = 456;
f1();
}
f2(); //123
function foo () {
var i1 = 1 // 局部
i2 = 2, // 全局
i3 = 3; // 全局
}
var arr = [];
for ( var i = 0; i < 10; i++ ) {
arr.push( i );
}
for ( var i = 0; i < 10; i++ ) {
console.log( arr[ i ] );
}
// 一般都是将变量的声明全部放到开始的位置, 避免出现因为提升而造成的错误
var arr = [],
i = 0;
for ( ; i < 10; i++ ) {
arr.push( i );
}
for ( i = 0; i < 10; i++ ) {
console.log( arr[ i ] );
}
标签:
原文地址:http://www.cnblogs.com/brightking/p/5745657.html