JavaScript学习——《精通JavaScript》读书笔记

第2章 特性、函数和对象

语言特性

引用与值,js中采用引用两种方式来保存数据。原始值复制到变量中,而其余部分都依赖引用,从而表征上看的是多个不同名的对象维护相同的数据。

作用域

不同于块作用域的语言,js中只有两种作用域:函数作用域全局作用域

举个栗子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var foo = 'test';

if(true){
//其实修改的是全局作用域
var foo = 'new test';
}

// 我们会发现这个是true,js中if块语句修改的是全局作用域
console.log(foo === 'new test');

function test() {
var foo = 'old test';
// 函数作用域中我们这里看到的是ture
console.log(foo === 'old test');
}

//退出函数作用域我们看到的依旧是new test
console.log(foo === 'new test');

另外还需要注意隐式的全局变量声明,专业的js程序猿都应该使用var来初始化变量。这样变量才会拥有你所期望的作用域,避免出乎意料的产生全局变量(比如在函数中不加var)。

上下文

你的代码总是拥有某种形式的上下文(代码执行的环境)。上下文是一件强有力的工具,也是面向对象代码必不可少的组成部分。

太秀了,直接给函数然后就可以调用函数的方法了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function setFoo(fooInput){
this.foo = fooInput;
}

var foo = 10; //这里定义全局变量foo
var obj = {foo:10}; //定义一个对象,一个成员foo

//此时foo的值为10
setFoo(30);
//全局调用,this实际上是window,所以全局变量foo值为30

//骚操作来了
obj.setFoo = setFoo;
obj.setFoo(30);
//这样一来将setFoo()与obj绑定在一起,通过this访问obj的上下文,修改了对应的值。

Javascript中有两种方法可以在指定的上下文中运行函数。