//1. 把整個函式體加小括號包在小括號裡面
(function
(){}(
alert(0);
));//2. 只把函式體放在小括號裡,呼叫的小括號放在外面
(function
()) ();
// 也可以像以下這樣使用自執行函式
+function
()()
-function
()()
!function
()()
~function
()()
^function
()()
// 上面的語法都可以讓自執行函式跑起來
(function
(w))(window)
因為沙箱的本質就是要進行隔離,那麼直接在沙箱中使用外界的內容會破壞這個隔離的基本原則,所以,將外界的東西通過傳參的形式傳入沙箱內進行使用,那麼沙箱中使用的就完全都是沙箱自己的內容了。
有利於**壓縮,因為內建物件名稱無法被壓縮,如果作為引數傳進來,那麼我們使用的就是形參名,形參是可以被壓縮的!
var arr = [1,2,3,4,5];
arr.foreach(function
(value,index,arr))
// foreach語法用法如上所示;(arr引數一般用不到)
// 我們可以來扒一扒foreach方法實現原理;
//假裝給陣列原型上加乙個我們自己的foreach方法
array.prototype.myforeach = function
(callback)
} // foreach的原理基本實現完了,是不是很簡單
// 下面我們可以呼叫一下試試看;
var arr1 = [1,2,3,4,5];
arr1.myforeach(function
(value,index))
// 是不是也能用哈
var arr = [1,2,3,4,5];
var result = arr.map(function
(value,index))
console.log(arr);
console.log(result);
//arr陣列和result陣列中存在的值都一樣;
// 我們也可以來看看map方法的實現原理;
array.prototype.mymap = function
(callback)
return result;
}//值得一提的是map函式也可以傳string number等建構函式作為引數;
var arr1 = [1,2,3,4,5];
var res = arr1.mymap(string); // 陣列每一項會變成string型別
console.log(res); //["1" , "2", "3", "4", "5"]
1.
function
test
() var obj = {};
obj.test = test;
obj.test(); // this指向window
2.var obj =
}var test = obj.test;
test(); // this指向window
new obj.test(); // this指向test函式建立出來的物件
3.var arr = [
function
(), function
() ];
arr[0](); // this指向這個陣列物件
4.var length = 10;
function
test
() test(function
())5.
// 工廠模式建立物件,this的指向
function
person
(name,age)
var p = person("小明",18); //這裡的this指向window;
6.// 寄生模式建立物件,this的物件
function
person
(name,age)
ar p = new person("張學友", 18);
// this的指向是被person建立出來的物件
//這裡值得一說的是,左後return obj了 建構函式的return語句如果return乙個引用型別的資料是可以改變new預設的this指向的;
function
test
() test();
var obj =
}obj.test();
obj["test"]();
function
person
() var p = new person();
執行上下文:我們在寫乙個方法的時候,總是會用到乙個關鍵字this,而this的指向就是我們這裡所說的執行上下文(執行環境);
1. call
function
test
(a, b)
var obj =
console.log(test.call(obj,1,2)); // 這裡的this指向obj物件而不是window
var arr =
var str = object.prototype.tostring.call(arr);
console.log(str); //[object array];
// 通過借用object原型上的tostring方法 把this指向arr;
// 這裡我們可以模擬實現一下obejct.prototype.tostring.call方法
obejct.prototype.mytostring = function
() var arr = ;
var date = new date()
var str = object.prototype.mytostring.call(arr);
console.log(str); //[obejct array];
var str = object.prototype.mytostring.call(date);
console.log(str); // [object date]
// 這樣我們就基本實現了 object.prototype.tostring.call方法的原理了
// 主要利用call欺騙建構函式;
function
test
(a, b)
var obj =
console.log(test.call(obj,[1,2])); //this也是指向obj物件
方法如果第乙個引數不傳,則函式中的this會指向window物件!
具體情況我們看下面**
1.
function
test
(a, b)
var obj = ;
console.log(test.call(1,2)) //this會指向window
2.function
test
(a, b);
var obj = ;
console.log(test.call("a",1,2)) //this會指向string
3.function
test
(a, b);
var obj = ;
console.log(test.call(null,1,2)) //this會指向window
var fakearr = ;
var realarr =
realarr = array.prototype.slice.call(fakearr);
// 上述三種方法都可以讓類陣列轉換為陣列
// 講到這裡,我們也可以來模擬一下slice方法的實現原理
array.prototype.myslice = function
(startindex,endindex)
return arr;
}
// 我們先用一般方法實現求最大值的功能
var arr = [22,33,4,666,12,22,34,56,21];
var max = arr[0];
for(var i = 1; i < arr.length; i++)
console.log(max);
console.log(max);
function
person
() function
student
() var stu = new student();
console.log(stu.name); // 小明
自執行函式和匿名函式
所謂匿名函式就是沒有名字的函式,形式如下 function 既然沒有名字,那麼如何呼叫呢 var b function b 可以將匿名函式付給乙個變數,這個變數現在就充當了這個函式的名稱,但是記住,這個不是名稱,我只是這麼叫,如果覺得不妥的話,可以認為b現在就是這個匿名函式的代表,在用的時候用b就等...
自執行函式
var a 2 function foo console.log a 2 由於函式被包含在一對 括號內部,因此成為了乙個表示式,通過在末尾加上另外乙個 可以立即執行這個函式,比如 function foo 第乙個 將函式變成表 達式,第二個 執行了這個函式。這種模式很常見,幾年前社群給它規定了乙個術...
JS自執行函式
函式表示式立即執行 函式宣告想要立即執行,會報錯 按照上面的分析,我們如果在第乙個 前面加上函式名稱,在第二個 裡面加入表示式,那麼就不會報錯了,我們來看一下效果 改掉語法錯誤以後的函式宣告 可以看到修改了那兩處的問題以後,報錯消失了,但是這個時候函式並沒有執行,原因上面也已經提到了,就是一旦被當作...