---做用域&閉包篇

做用域&閉包篇

什麼是閉包

「閉包是指有權訪問另外一個函數做用域中的變量的函數」--《JavaScript高級程序設計》javascript

具體一點

function foo(){
    var a = "test";
    function bar(){
        return a;
    }
    return bar();
}
//如今回頭再看看閉包的定義:)
var b = foo();
bar();  //a
複製代碼

小練習

/* * 題目: * 完善工廠函數 createPerson,須要完成如下要求: * 1.保存傳入參數 name 到一個私有變量中 * 2.函數返回一個對象,且對象帶有一個方法 getName,用於返回對象的私有變量 name 的值 */

function createPerson(name) {
    var n = name;
    var result = {
        getName : function(){
            return n;
        }
    }
    return result;
}

var person = createPerson('web');
console.log(person.name); //你什麼都得不到的,相信我
console.log(person.getName());
複製代碼

再進一步,看一下Js中的做用域

this是什麼

this其實指的就是函數的執行環境,看下面一段代碼java

window.name = "web";
var o = {
  name :  "test"
};
function sayName(){
    console.log(this.name);
}

sayName();  //web,執行環境windows
o.sayName = sayName;
o.sayName(); //test,執行環境o
複製代碼

一些特性

1.this並非聲明函數時就已經肯定的,調用時纔會肯定this的取值
2.全局環境下執行函數this通常指向window,對象的方法通常指向對象
複製代碼

練習

函數的方法--改變this指向

bind

window.name = "web";
var o = {
  name :  "test"
};
function sayName(){
    console.log(this.name);
}

o.sayName = sayName.bind(window);
o.sayName(); //web,執行環境window
複製代碼

call和apply

window.name = "web";
var o = {
  name :  "test"
};
function sayName(){
    console.log(this.name);
}

sayName.call(o);  //test,執行環境o
sayName.apply(o);   //test,執行環境o
複製代碼

call與apply的區別

sayName.call(o,1,2,3);  //正常傳參
sayName.apply(o,[1,2,3]);   //只接受兩個參數,第一個參數執行環境,第二個是參數的數組
複製代碼

練習

相關文章
相關標籤/搜索