日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

读javascript高级程序设计03-函数表达式、闭包、私有变量

發布時間:2023/11/27 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 读javascript高级程序设计03-函数表达式、闭包、私有变量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、函數聲明和函數表達式

定義函數有兩種方式:函數聲明和函數表達式。它們之間一個重要的區別是函數提升。

1.函數聲明會進行函數提升,所以函數調用在函數聲明之前也不會報錯:

test();
function test(){
alert(1);
}

2.函數表達式不會進行函數提升,函數調用在函數聲明之前的話會報錯:

test(); // test is not a function
var test=function(){
alert(1);
}

二、遞歸函數

遞歸函數是通過在函數內部調用自身實現的。

①直接使用函數名進行遞歸調用

function f(num){if(num==1){return 1;}else{return num*f(num-1);}
}
console.log(f(4));//24
console.log(f(5));//120

這種實現的缺點是,在函數內部直接寫死了函數名稱。如果進行如下設置就會報錯:

var test=f;
f=null;
console.log(test(3));//報錯, f is not a function

②通過arguments.callee解決,arguments.callee是一個指向正在執行的函數的指針。這樣就避免了上述問題。

function f(num){if(num==1){return 1;}else{return num*arguments.callee(num-1);}
}
console.log(f(4));//24
console.log(f(5));//120
var test=f;
f=null;
console.log(test(3));//6

不過這種方式還有一個缺點,就是在嚴格模式下會執行失敗。

添加"use strict"后執行會報錯:

'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

③采用命名函數表達式可以在嚴格模式下成功。

"use strict";
var f=function t(num){
if(num==1){return 1;}else{return num*t(num-1);}
}
console.log(f(4));//24
console.log(f(5));//120
var test=f;
f=null;
console.log(test(3));//6

三、閉包

閉包是有權訪問另一個函數作用域內變量的函數。創建閉包的常見方式就是在一個函數內創建另外一個函數。在另一個函數內部定義的函數,會把外部函數的作用域添加到其作用域鏈中。

1.閉包與變量

①閉包只能取得包含函數中任意變量的最后一個值。例如:

function createFunctions(){var result=new Array();for(var i=0;i<10;i++){result[i]=function(){return i;}}return result;
}
var result=createFunctions();
result[1]();//10

這個方法調用傳入1-10返回結果都是10,這并不符合預期。

②通過匿名函數進行改造:

function createFunctions(){var result=new Array();for(var i=0;i<10;i++){result[i]=(function(num){return num;})(i);}return result;
}
var result=createFunctions();
result[2];//2

改造后的運行結果符合我們的預期了。因為將i傳遞給num命名參數時是按值傳遞的。

2.閉包中的this

this變量是在運行時基于函數的執行環境綁定的。

在全局執行環境中,this指向window對象;

當函數作為某個對象的方法時,this等于那個對象;

匿名函數的執行具有全局性,this通常指向window對象。

①閉包中this實例:

var name='window';
var object={name:"object",getName:function(){return function(){return this.name;}
} 
};
object.getName()();//window

②先將閉包外部作用域中的this保存到一個閉包能訪問到的變量中,這樣就可以讓閉包訪問相應的對象了。例如:

var name='window';
var object={name:"object",getName:function(){
var that=this;return function(){      return that.name;}
} 
};
object.getName()();//object

轉載于:https://www.cnblogs.com/janes/p/3830251.html

總結

以上是生活随笔為你收集整理的读javascript高级程序设计03-函数表达式、闭包、私有变量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。