我有一个我正在创建的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();
});
答案 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)您感到困惑scope
和context
2)与其他语言不同,this
是可变的 - 它取决于调用者所绑定的对象
3)javascript中没有“私有”或“公共”:只有对象属性总是公共的和变量的,这些属性仅限于封闭函数的范围。请考虑以下示例:
var object = {
x:10,
func: function(){
var x = 1;
console.log(x, this.x);
}
}
object.func();
现在会输出1
和10
因为两个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函数