簡體   English   中英

函數中的this和var之間的區別

[英]Difference between this and var in a function

我有一個我正在創建的javascript類。 此類具有私有和公共函數/屬性。 我對私人和公眾的理解是, this是公開的,而var是該職能及其成員的私人所有。 但是,在本地函數buildFramework() ,當我調用var settings.currentView我得到錯誤:

settings.currentView未定義

我的問題是,函數范圍和它的成員以及全局范圍之間的thisvar什么區別?

namespace('example');
example.InstagramViewer = function (options) {
    // this works when called within buildFramework()
    this.settings = $.extend({
        currentView: 'grid'
    }, options);

    // this doesn't work when called within buildFramework()
    var settings = $.extend({
        currentView: 'grid'
    }, options);

    var viewer;

    this.init = function () {
        buildFramework();
    };

    var buildFramework = function() {
        viewer = $(viewerWrapper).append('<div id="instagramViewer" class="' + settings.currentView + '"></div>'); // this doesn't work
        viewer = $(viewerWrapper).append('<div id="instagramViewer" class="' + this.settings.currentView + '"></div>'); // this does work
    };
}

並且這樣稱呼......

$(function () {
    var viewer = new connectionsAcademy.publicWebsite.web.js.teenWebsite.InstagramViewer();
    viewer.init();
});

這里有很多不同之處。

首先,'this'是一個關鍵字,它是對調用對象的引用。 如果按原樣調用函數,則窗口將是調用對象,並且您使用關鍵字“this”設置全局變量。

InstagramViewer();
console.log(window.settings);

但是,如果通過另一個對象調用函數,則窗口將不再是調用對象,而是設置全局變量,而不是在該對象上設置成員變量。

var obj = {InstagramViewer: InstagramViewer};
obj.InstagramViewer();
console.log(obj.settings);

在這兩種情況下使用'var'沒有區別。 'var'與'this'的工作方式不同,因為除了我們稱之為函數的暫存器之外,它不會影響任何對象。 只有該函數可以訪問其暫存器(除非您創建某種類型的閉包,它在此便箋簿上公開變量)。 這就是為什么您可以將使用'var'定義的變量視為私有的原因。

在處理'刪除'時,使用'var'與'this'不同。 'delete'不適用於使用'var'聲明的變量,但它會在'this'或任何其他對象上定義變量時使用。

var F = function() {
    this.foo = 'foo';
    var bar = 'bar';

    delete(bar);
    delete(this.foo);

    alert(bar);
    alert(this.foo);
};


F();

我的解釋是粗略的,但這是一個很大的主題,在這種情況下無法輕易解釋。 我強烈建議你閱讀這本書http://shop.oreilly.com/product/9780596000486.do 特別是第7章。

我對私人和公眾的理解是,這是公開的,而var是該職能及其成員的私人所有

那是不對的。

var <variable_name>在當前作用域中聲明具有對應名稱的變量。 你不能寫var foo.bar因為foo.bar是不正確的變量名。

this.name -它的訪問屬性name對象的this

如果你只是在對象的閉包中定義函數,它們就是“私有的”。 您可以通過將它們作為屬性添加到對象本身來公開它們:

function ObjectWithPrivateFunction() {

  var _privateVariable = 0;

  function _privateFunction(someValue) {
    _privateVariable = someValue;
  } // _privateFunction()

  this.publicAccessToPrivateFunction = _privateFunction;

} // ObjectWithPrivateFunction()

1)你混淆了scopecontext
2)與其他語言不同, this是可變的 - 它取決於調用者綁定的對象。
3)javascript中沒有“私有”或“公共”:只有對象屬性總是公共的和變量的,這些屬性僅限於封閉函數的范圍。 請考慮以下示例:

var object = {
    x:10,
    func: function(){
        var x = 1;
        console.log(x, this.x);
    }
}

object.func(); 現在將輸出110因為兩個x共存 - 一個作為元素object屬性 - 這是上下文,另一個x是一個限制在它的封閉函數范圍內的變量。

你正在做同樣的事情 - 你正在this對象上創建一個屬性(同樣非常重要 - this是可變的,取決於函數的調用方式),然后嘗試使用屬性currentView訪問變量setting ,這將失敗,因為JS檢查范圍但沒有找到相應的變量。

非常寬松地說,關鍵字this更像是一個公共類,其中var是嚴格私有的。

例如,

function testPublic(str)
{
    this.getTHIS=function()
                 {
                     alert(str)
                 }
}

function testPrivate(str)
{
    var getTHIS=function()
                {
                    alert(str);
                }
}


//now run the code
new testPublic('hello there').getTHIS(); //alert hello there

但是,對於第二個,您無法從父函數外部訪問getTHIS函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM