发表于: 2017-05-24 22:32:20

1 984


小课堂部分

1.背景介绍

作用域与作用域链是JS中非常重要的概念之一

学习作用域与作用域链对于深入了解JS的运行机制有很大的帮助。

2.知识剖析

a.变量作用域

全局作用域

全局变量拥有全局作用域

局部作用域

局部变量只有在定义他的函数体内有定义,他的作用域是局部性的,函数的参数也是局部变量 在函数体内,局部变量的优先级高于全局变量,同名的局部变量和全局变量,在函数体内,全局变量会被局部变量覆盖掉

ps.在函数体内不使用var声明变量,js会自动把这个变量识别为全局变量

b.函数作用域

区别于c语言及一些其他语言,js是没有块级作用域的,取而代之的是js自己的函数作用域 变量在声明他们的函数体内,及这个函数体嵌套的任意函数体内都是有定义的。

c.作用域链

如果将一个局部变量看作是自定义实现的对象的属性的话,那么我们可以换一个角度来理解变量作用域。每一段js代码都有一个与之关联的作用域链,这个作用域链可以看作是一个对象列表或者是一个链表,其中定义了这段代码作用域内的变量。

3.常见问题

如何理解作用域和作用域链

4.解决方案

// 全局变量和局部变量

var a = 0;

function test () {

var a = 1;

return a;

}

test(); //1

 

//嵌套函数和作用域

var c = 0;

function test () {

var helloC = 1;

function inTest () {

var heyC = 2;

//这里可以获取到目前为止所有的变量

console.log(c); //0

console.log(helloC); //1

console.log(heyC); //2

}

inTest();

console.log(c); //0

console.log(helloC); //1

console.log(heyC); //这里会报一个 heyC is defined 的错误,在这个位置,heyC这个变量是不存在的

}

test();

console.log(c);

//这里也是不能读取到 helloC heyC 这两个变量的

 

// 作用域链

var a = 10;

function test () {

var b = 10+a;

//test: 这里需要有个a window 你知道一个b

// window : a啊 我有啊 给你

function inTest () {

var c = b+10;

//inTest: 这里需要有个b test 你知道一个b

// test : b啊 我有啊 给你

return c;

}

var d = 10 + e;

//test:hey window 我这里需要一个 e 你有么

//window:我没有啊

//test:那你再去看看你上面的好么

//window:对不起 我就是最上层了 我给你报个错好了~

// test: 好吧

return inTest();

}

test();

5.编码实战

6.扩展思考

声明提升

//声明提升

function test () {

console.log(a);

var a = 1;

}

test(); //undefined

//等同于

function test () {

var a ;//s先将需要的变量声明

console.log(a);

a = 1; //在原来这里赋值

}

 

闭包

闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包最简单的方式就是在一个函数内创建另一个函数。

// 闭包

function test() {

    var a = 2;

    function inner() {

        console.log( a );

    }

    return inner;

}

var outter = test();

outter(); // 2

 

7.参考文献

javaScript高级程序设计

你不知道的JS


今天完成的任务

1.复盘项目禅道拆分完成

2.小课堂PPT和demon

明天的计划

1.正式开始复盘项目

收获

小课堂所讲的东西,明白了自己其实还有很多地方很模糊,需要回来再好好去看看




返回列表 返回列表
评论

    分享到