20、函數的調用方式(內容尚未完全,可自行百度這方面的知識) call()、apply()、bind() 這三個方法的作用都是改變執行環境中的this指針的指向 call()與apply() 這兩個方法的第一個參數都為this指針指向的目標對象,他們的區別是第二個參數開始傳參的方式不同 call傳參 ...
20、函數的調用方式(內容尚未完全,可自行百度這方面的知識) call()、apply()、bind() 這三個方法的作用都是改變執行環境中的this指針的指向 call()與apply() 這兩個方法的第一個參數都為this指針指向的目標對象,他們的區別是第二個參數開始傳參的方式不同 call傳參:obj, arg2,arg3,..... apply傳參:obj, [arg2,arg3,..... ] function func(a, b){ return this.value + a + b; } var obj = { value: 1, }; func.call(obj, 2, 3); //6 func.apply(obj, 2, 3);//6 //call()和apply()如果第一個參數不是對象類型,那麼這個參數會被自動轉化為對象類型 function func(){ console.log(Object.prototype.toString.call(this)); } func.call(2); bind() 第一個參數為this指針指向的目標對象,bind方法執行後返回的是一個新函數 function func(){ console.log(this.name); } var obj = { name: '張三', }; var f = func.bind(obj); f(); //張三 //在這個新的函數對象中,this被永久的綁定到了bind的第一個參數上面,五六年後期這個函數被如何使用,this都不會改變 var obj27 = { name: '李四', f: f, }; obj2.f(); //張三 call()、apply()、bind() 如果這三個方法都沒有提供第一個參數或者是參數是this、null、undefined中的一種,那麼都將預設第一個參數的為Global對象 21、全局變數和局部變數 在函數內部聲明的變數為局部變數,函數外部不能使用; 函數外部聲明的變數為當前js文件的全局變數 如果沒有var修飾的變數也為全局變數,這個變數在哪都可以訪問 var a = 1; function test(){ console.log(a); //1 var b = 2; console.log(b); //2 } test(); console.log(a); //1 console.log(b); // b is not defined 當函數內部的變數和全局變數同名,函數內部就不會使用外部的變數 var g = 100; function testG(){ console.log(g); //undefined var g = 200; console.log(g); //200 } testG(); console.log(g); //100 22、函數的屬性和方法 1)length:表示函數希望接受的命名參數的個數 function test(a, b){ return 'hello'; } console.log(test.length); //2 ---->形參的個數 test(); console.log(test()); //hello 2)函數作為參數 function handle(fun){ var msg = "hello"; fun(msg); } handle(function(m){ console.log(m); //hello }); 3)函數作為返回值 function handle2(){ return function(){ console.log(123); } } handle2(); //這返回的只是一個函數名 handle2()(); //123 23、值傳遞和引用傳遞 1)基本數據類型的傳遞就是值傳遞 不會影響上一個變數的值 var a = 1; var b = a; console.log(a, b); //1 1 b = 3; console.log(a, b); //1 3 2)引用數據類型的傳遞就是址傳遞 兩個變數的值會變成一模一樣 var obj = { name: 'zhangsan', age:12, }; var obj2 = obj; console.log(obj, obj2); // {name:'zhangsan',age:12,} {name:'zhangsan',age:12,} obj2.gender = 'male'; console.log(obj, obj2); //{name:'zhangsan',age:12, gender:'male',} {name:'zhangsan',age:12,gender:'male', } 24、閉包(函數訪問上下文中的變數) var arr = []; for(var i = 0; i < 5; i++){ arr[i] = function(){ console.log(i); } } arr[0](); //5 arr[1](); //5 arr[2](); //5 arr[3](); //5 arr[4](); //5 上述現象就是閉包現象 解決方法將上面的arr[i]改為下麵的arr[i] arr[i] = (function(num){ return function(){ console.log(num); }; })(i);