自執行函式 map迴圈 call和apply用法

2021-08-01 16:01:43 字數 4666 閱讀 8431

//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自執行函式

函式表示式立即執行 函式宣告想要立即執行,會報錯 按照上面的分析,我們如果在第乙個 前面加上函式名稱,在第二個 裡面加入表示式,那麼就不會報錯了,我們來看一下效果 改掉語法錯誤以後的函式宣告 可以看到修改了那兩處的問題以後,報錯消失了,但是這個時候函式並沒有執行,原因上面也已經提到了,就是一旦被當作...