1. 程式人生 > >極客學院之javascript高階技巧

極客學院之javascript高階技巧

1、變數作用域和閉包

function test(){                          

if(false){

  var i=10}

else{

var t=100;

}

alert(t);}

test();

//js是函式級別的作用域,在內部的變數,內部都能訪問,外部不能訪問內部的,內部能訪問外部的

var j=100;

~(function test(){

 console.log(j);})();

//波浪線才能有意義,是把~後的一塊變成一個表示式然後輸出

var j=100;

function test(){

var j;

alert(j);

j=10;}

test();

結果:undefine,,因為內部的var j;把外部的var j=1001給幹掉了,內部的j=10;還沒賦值就已經輸出了

 閉包:

function test(){

var k=1000;

return function(){

return k;

}

}

var t=test()();

alert(t);

//閉包:就是拿到本不該屬於自己的東西

2、this指標的使用:誰呼叫它,this就指誰

this.m=1000;

var obj={

m:100;

test:function(){

alert(this.m);

}

}

obj.test();

結果:100;因為呼叫了obj的this。

加入閉包特殊情況

this.m=1000;

var obj={

m:100;

test:function(){

alert(this.m);

}

return function(){

alert(this.m);

}

}

(obj.test())();  或者      var t=obj.test();       window.t();s

結果:先彈出100,後彈出1000;因為採用了閉包方法return:它把this丟擲到外面window處了,所以獲取的是外面的this.m=1000;

this.a=1000;

function test(){

this.a=1;

}

test.prototype.geta=function(){

return this;

};

var p=new test;

console.log(p.geta());

//prototype 屬性使您有能力向物件新增屬性和方法

結果:p是test()new出來的,p.geta()=1;因為呼叫了geta的this,通過prototype給原形test的this添加了方法,this又是test()中this.a=1。 

3、按值傳遞和按引用傳遞

function test(num){

 num=num+1;

return num;

}

var num=1;

alert(test(num));

結果:2

//按值傳遞

function test(num){

//這裡對num這個變數建立了一個記憶體的副本

var num=num+1;

return num;

}

var num=1;//此時num為number

alert(test(num);

alert(num);

結果:首先彈出2 ,然後彈出1

//按引用傳遞

function test(obj){

//當前的Obj對記憶體的這個地址指向同一個

obj.age='20';

console.log("inner","obj");

}

var obj={                //此時Obj為物件

name:"xiaoming";

}

test(obj);

console.log('outer',obj);

結果:inner Object{name:"xiaoming",age:"20"}

            outer Object{name:xiaoming",age:"20"}

//引用型別:js物件,object,array

//值型別:string ,number,boolean