![](/img/trans.png)
[英]what is the difference between var a = {} and var a = function(){}
[英]Difference between this and var in a function
我有一個我正在創建的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();
});
這里有很多不同之處。
首先,'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)你混淆了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
是可變的,取決於函數的調用方式),然后嘗試使用屬性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.