極客學院之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
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