(转)理清apply(),call()的区别和关系
?
from:http://www.popo4j.com/article/the-differences-of-apply-and-call.html
?
如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语言过程中遇到这种感觉,那么就从现在形始,请放下的您的”偏见”,因为这对您来说绝对是一片新大陆,让JavaScrip慢慢融化以前一套凝固的编程意识,注入新的生机!
好,言归正传,先理解JavaScrtipt动态变换运行时上下文特性,这种特性主要就体现在apply, call两个方法的运用上.
区分apply,call就一句话,
01
var
?oP = Object.prototype,
02
toString = oP.toString;
03
04
console.log(toString.call([123]));
//[object Array]
05
console.log(toString.call(
'123'
));
//[object String]
06
console.log(toString.call({a:?
'123'
}));
//[object Object]
07
console.log(toString.call(/123/));
//[object RegExp]
08
console.log(toString.call(123));
//[object Number]
09
console.log(toString.call(undefined));
//[object Undefined]
10
console.log(toString.call(
null
));
//[object Null]
11
//....
?
标准浏览器中完美的作到,但是(为什么要说但是呢)IE6中,却会出现以下问题:通过Object.prototype.toString.call获取的 字符串,undefined,null均为Object01
var
?oP = Object.prototype,
02
toString = oP.toString;
03
04
function
?typeOf(value) {
05
????
if
?(
null
?=== value) {
06
????????
return
?'null'
;
07
????
}
08
09
????
var
?type =?
typeof
?value;
10
????
if
?(
'undefined'
?=== type ||?
'string'
?=== type) {
11
????????
return
?type;
12
????
}
13
14
????
var
?typeString = toString.call(value);
15
????
switch
?(typeString) {
16
????
case
?'[object Array]'
:
17
????????
return
?'array'
;
18
????
case
?'[object Date]'
:
19
????????
return
?'date'
;
20
????
case
?'[object Boolean]'
:
21
????????
return
?'boolean'
;
22
????
case
?'[object Number]'
:
23
????????
return
?'number'
;
24
????
case
?'[object Function]'
:
25
????????
return
?'function'
;
26
????
case
?'[object RegExp]'
:
27
????????
return
?'regexp'
;
28
????
case
?'[object Object]'
:
29
????????
if
?(undefined !== value.nodeType) {
30
????????????
if
?(3 == value.nodeType) {
31
????????????????
return
?(/\S/).test(value.nodeValue) ??
'textnode'
:?
'whitespace'
;
32
????????????
}?
else
?{
33
????????????????
return
?'element'
;
34
????????????
}
35
????????
}?
else
?{
36
????????????
return
?'object'
;
37
????????
}
38
????
default
:
39
????????
return
?'unknow'
;
40
????
}
41
}
?