gpt4 book ai didi

javascript - 函数中 this 和 var 的区别

转载 作者:行者123 更新时间:2023-12-02 19:22:27 25 4
gpt4 key购买 nike

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

settings.currentView is not defined

我的问题是,在函数及其成员以及全局作用域中,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);

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

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

在这两种情况下使用“var”没有什么区别。 'var' 的工作方式与 'this' 不同,因为除了我们称之为函数暂存器的对象之外,它不影响任何对象。只有该函数可以访问其暂存器(除非您创建某种在此暂存器上公开变量的闭包)。这就是为什么您可以将使用“var”定义的变量视为私有(private)变量。

在处理“delete”时,使用“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 章。

关于javascript - 函数中 this 和 var 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12377957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com