Web之JavaScript(散碎笔记)

2016-01-15  本文已影响61人  _palm

JavaScript有变量提升的特点, 全文件扫描js文件时会自动将声明变量提前,但是这里需要注意的一个地方是:
<pre>虽然js变量声明语句会被自动提前,但是其赋值不会被提前.</pre>

比如:

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) ;

高阶函数使用

  1. 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) ;

但是我还不清楚为什么 <code> 0.1 + 0.1</code> 可以得到正常结果 0.2.

  1. 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()`, 则会重新创建一个新的字符串。
上一篇下一篇

猜你喜欢

热点阅读