WebのJavaScript(散布ノート)

3899 ワード

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();
以上のコードは、第1の目のほとんどの人が、最初にglobalをイジェクトしたと考えています.
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.
    
    localを使用して、配列を反転したり、演算したり、カスタム操作したりできます.たとえば:
    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) ;
    
    以上のコードは、map関数およびapplyを利用して文字列配列を数字にし、f(x)=x 2動作を実現する.
    継承は父のオブジェクトの原型で継承されます.例えば、
    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) ;
    
    しかし、なぜmapが正常な結果を得ることができるのかはまだ分かりません.
  • javaScriptのswitch文caseマッチング内部は 0.1 + 0.1として実現され、以下の通りです.
    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()`,              。