函数中的this和var之间的区别

时间:2012-09-11 21:08:48

标签: javascript

我有一个我正在创建的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();
});

5 个答案:

答案 0 :(得分:2)

这里有很多不同之处。

首先,'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章。

答案 1 :(得分:1)

  

我对私人和公众的理解是,这是公开的,var是该函数及其成员的私有

这是不正确的。

var <variable_name>在当前范围内声明具有对应名称的变量。您无法编写var foo.bar,因为foo.bar的变量名称不正确。

this.name - 它正在访问对象name的属性this

答案 2 :(得分:0)

如果你只是在对象的闭包中定义函数,它们就是“私有的”。您可以通过将它们作为属性添加到对象本身来公开它们:

function ObjectWithPrivateFunction() {

  var _privateVariable = 0;

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

  this.publicAccessToPrivateFunction = _privateFunction;

} // ObjectWithPrivateFunction()

答案 3 :(得分:0)

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是可变的,具体取决于函数的调用方式)然后尝试访问变量具有属性setting的{​​{1}}将失败,因为JS检查范围但未找到相应的变量。

答案 4 :(得分:-1)

非常宽松地说,关键字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函数