JavaScript有变量提升的特点, 全文件扫描js文件时会自动将声明变量提前,但是这里需要注意的一个地方是:
虽然js变量声明语句会被自动提前,但是其赋值不会被提前.
比如:
function test() {
alert(" test -- " + name) ;
var name = "hello.javascript." ;
}
调用test
函数后 弹出内容为 test -- undefined
, 就是这个原因,虽然能找到这个变量,但是赋值不会自动提前,也就变为未定义或者未初始化变量了
。
但是目前我还不知道 这种操作是在什么时候,不知道是在javascript引擎解释的时候还是在调用的时候. 我个人的理解更倾向于引擎解释的时候.
在比如:
myname = "global"; // 全局变量
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
以上代码,第一眼大部分人都会认为 先弹出global
在弹出local
其实不是.因为变量声明被提升其实代码应该是这样的:
myname = "global"; // 全局变量
function func() {
var myname ;
alert(myname); // "undefined"
myname = "local";
alert(myname); // "local"
}
func();
//使用apply可以修复普通函数的this指针.
这里步骤如下:我们先保存原函数的指针然后使用apply 修复this指针,这里普通函数this指向null 或者window
//统计函数parseInt调用次数 , 我们先保存原函数 ,然后覆写函数parseInt 将计数器累加1,然后使用apply修复原函数指针.
oldparseInt.apply(null,arguments) ; 这样相当于修改了原parseInt函数实现.
var count = 0 ;
var oldparseInt = window.parseInt ;
var parseInt = function() {
count +=1 ;
return oldparseInt.apply(window,arguments) ;
} ;
parseInt('10') ;
parseInt('16') ;
parseInt('14') ;
parseInt('13') ;
parseInt('11') ;
parseInt('19') ;
parseInt('12') ;
parseInt('14') ;
parseInt('15') ;
parseInt('17') ;
alert(count) ;
//apply
//我们可以将一个函数绑定到一个对象中.比如:
function run() {
return ' string is ' + this.name + this.age ;
}
var obj = {
name : 'palm' ,
age : 24
} ;
var value = run.apply(obj,[]) ; //这里使用apply间接的就已经调用函数run ,会返回执行结果.
alert(value) ;
高阶函数使用
- map
在js中我们可以将一个函数赋值给一个变量,如下:
var fun = function() {
return '这是一个函数.' ;
}
然后,函数可以接收一个变量作为参数,那么函数也可以接收一个函数作为参数。如下:
function fun1() {
return 'hello, javaScript.' ;
}
function fun2(x) {
var value = x() ;
return value ;
}
alert(fun2(fun1)) ; //hello, javaScript.
我们使用map
可以将数组反转、运算或者自定义操作等。例如:
var oNumber = window.Number ;
var Number = function(x) {
return x*x ;
}
oNumber.apply(window,[]) ;
var arr = ['8','0','1','2','3','4','5','6'] ;
var arrstr = arr.map(Number) ;
alert( 'source code - ' + arr + 'now --' + arrstr) ;
以上代码利用了apply
函数和map
使 字符串数组变为数字,并实现f(x) = x2 操作。
继承会在父对象的原型上继承.比如:
function Foo() {
this.foo = ' Foo\'s perpoties.' ;
}
function Bar() {
}
Bar.prototype = new Foo() ;
Bar.prototype.constructor = Bar ;
var bar = new Bar() ;
var bar1 = new Bar() ;
bar1.foo = 'bar1\'s perpoties.' ;
alert(bar1.foo) ; //bar's perpoties.
//console.log('==== ' + bar.constructor) ;
2.javaScript 中浮点运算会丢失精度,得到的结果只会无限接近正确值,而不等于正确值,比如:
var v1 = 0.1 ;
var v2 = 0.2 ;
console.log(v2 + v1) ;
但是我还不清楚为什么 0.1 + 0.1
可以得到正常结果 0.2
.
- javaScript中switch语句case匹配内部实现为
===
,如下:
function fun(value) {
switch(value) {
case 'A' : console.log('A') ; break ;
case 'B' : console.log(B) ; break ;
case undefined : console.log('unkown.') ; break ;
default :
console.log(' miss.') ;
}
}
//fun('A') ;
fun(String('A')) ; //A
fun(new String('A')) ; //miss.
```
上面使用`String()` 强转为字符串时不会新创建一个字符串,如果使用`new String()`, 则会重新创建一个新的字符串。