读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-函数表达式、闭包、私有变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 心如直水下一句是什么啊?
- 下一篇: jsp error-page没有生效