0x0B

Summer Training Day 12.

apply&call&bind.
json


call&apply&bind


apply()

1
2
3
4
5
6
7
8
var x = 0;
function test(){
  alert(this.x);
}
var o={};
o.x = 1;
o.m = test;
o.m.apply(); //0

apply()和call()

1
2
function.apply(thisArg, [argsArray])
thisArg //传入functionthis的值(可以改变this指向thisArg)


thisArg
在 fun 函数运行时指定的 this 值。需要注意的是,指定的 this 值并不一定是该函数执行时真正的 this 值,如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的 this 会指向该原始值的自动包装对象。
argsArray
一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 fun 函数。如果该参数的值为null 或 undefined,则表示不需要传入任何参数。”
以上为MDN的解释.其实就是改变this指向,从原来的改为指向thisArg.
call和apply类似,不同点在于call第二项需要直接传递给函数,即一项一项写出来,apply可以以一个数组形式写出来.

bind()

bind会创建一个函数的实例,this值会绑定到传给bind()函数的值.本质上同apply&call但是需要赋给变量.


json

(Javascript Object Notation.)是一种数据格式而非语言.

语法.

可以表示以下三种类型的值.

简单值

数字,字符串,布尔值,null
(字符串必须使用双引号)

对象

JSON无变量,没有变量的概念,所以没有声明变量这一步骤,语句结束也无分号.
如:

1
2
3
4
5
6
7
8
{
"name": "Nicolas",
"age": 29,
"school": {
"name": "Merrimack College",
"location": "North Andover, MA"
}
}

json中不能写注释.

数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[
{
"title": "Professional JavaScript",
"authors": [
"Nicolas C. Zakas"
],
"edition": 3,
"year": 2011
},
{
"title": "Professional JavaScript",
"authors": [
"Nicolas C. Zakas"
],
"edition": 2,
"year": 2009
},
]


解析与序列化选项.

stringify() 与 parse()

前者转化为JSON字符串,后者解析.
前者输出的JSON不包含任何空格字符或缩进,因此保存在jsontext中的字符串显示如下:

1
{"title": "Professional JavaScript","authors": ["Nicolas C. Zakas"],"edition": 3,"year": 2011}

所有函数及原型成员都会被有意忽略,值为undefined的任何属性也会被跳过.

序列化选项

第二个参数: 函数

1
var jsontext = JSON.stringify(book,["title","edition"]);

第三个参数: 缩进和空白符

1
var jsontext = JSON.stringify(book,null,4);

换行符自动包含,缩进空格数为4;
也可以变成:

1
var jsontext = JSON.stringify(book,null,"--");

缩进字符串最长不能超过10个,若超过了只显示前10个.


可以在js任意对象中添加toJSON()方法,作为函数过滤器的补充.
stringify()顺序:
1.如果存在toJSON()方法且能通过它取得有效值,则调用该方法,否则返回对象.
2.如果提供了第二个参数,应用改函数过滤器.传入函数过滤器的值是第一步返回的值.
3.对第2步返回的值进行相应序列化.
4.若提供了第三个参数,执行相应格式化.

Ajax待续..



以上.