0

我有一个我正在创建的 javascript 类。此类具有私有和公共功能/属性。我对私有和公共的理解是,它this是公共的,并且var对于该功能及其成员来说是私有的。但是,在本地函数buildFramework()中,当我调用时var settings.currentView出现错误:

settings.currentView没有定义

this我的问题是,函数及其var成员的范围以及全局范围之间有什么区别?

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();
});
4

5 回答 5

2

这里有很多不同之处。

首先,“this”是一个关键字,它是对调用对象的引用。如果按原样调用函数,则窗口将是调用对象,并且您正在使用关键字“this”设置全局变量。

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

但是,如果您通过另一个对象调用您的函数,window 将不再是调用对象,您将在该对象上设置一个成员变量,而不是设置全局变量。

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。尤其是第七章。

于 2012-09-11T21:38:17.140 回答
1

我对 private 和 public 的理解是,这是公共的,而 var 是该函数及其成员的私有

这是不正确的。

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

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

于 2012-09-11T21:12:03.860 回答
0

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

function ObjectWithPrivateFunction() {

  var _privateVariable = 0;

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

  this.publicAccessToPrivateFunction = _privateFunction;

} // ObjectWithPrivateFunction()
于 2012-09-11T21:16:21.730 回答
0

1)你很困惑scope并且context
2) 与其他语言不同,this它是可变的——它取决于调用者绑定到哪个对象。
3) javascript 中没有“private”或“public”:只有始终为 public 和 variable 的 objectproperties 被限制在封闭函数的范围内。考虑以下示例:

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

object.func();现在将输出1并且10因为两者x确实共存 - 一个作为元素的属性object- 这是上下文,另一个x是限制在其封闭函数范围内的变量。

您正在做同样的事情-您正在this对象上创建一个属性(也非常重要-this是可变的,取决于函数的调用方式),然后尝试使用将失败setting的属性访问变量,因为 JS 检查范围但currentView没有找到相应的变量。

于 2012-09-11T21:45:17.700 回答
-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 函数

于 2012-09-11T21:55:19.097 回答