我正在研究一个项目一段时间,试图找出我做错了什么,当我最终将"错误"缩小到下面的代码不能按预期工作的事实时:
function Alpha()
{
this.onion = 'onion';
function Beta()
{
alert(this.onion);
}
Beta();
}
alpha1 = new Alpha();
// Alerts 'undefined'
Run Code Online (Sandbox Code Playgroud)
但是,如果我将代码更改为:
function Alpha()
{
var self = this;
this.onion = 'onion';
function Beta()
{
alert(self.onion);
}
Beta();
}
alpha1 = new Alpha();
// Alerts 'onion'
Run Code Online (Sandbox Code Playgroud)
它像我期望的那样工作.在浪费了我生命中的大部分时间之后,任何人都可以解释为什么它会像这样工作吗?
为什么不能eval在with语句下使用范围变量?
例如:
(function (obj) {
with (obj) {
console.log(a); // prints out obj.a
eval("console.log(a)"); // ReferenceError: a is not defined
}
})({ a: "hello" })
Run Code Online (Sandbox Code Playgroud)
编辑:正如知识渊博的CMS所指出的,这似乎是一个浏览器错误(使用WebKit控制台的浏览器).
如果有人想知道我试图提出什么憎恶,那将需要"邪恶" eval和with- 我试图看看我是否可以获得一个函数(用作回调)在另一个上下文中执行而不是它被定义为.不,我可能(咳)不会在任何地方使用它...比任何事都更好奇.
(function (context,fn) {
with (context)
eval("("+fn+")()");
})({ a: "hello there" }, function () { console.log(a); })
Run Code Online (Sandbox Code Playgroud) 假设我有类似的JavaScript代码
myClass = function(){
function doSomething(){
alert(this); // this1
}
}
alert(this); //this2
Run Code Online (Sandbox Code Playgroud)
这两个'这个'对象是指什么?
function Box(width, height)
{
this.width = width;
this.height = height;
}
var myBox = new Box(5,5);
Run Code Online (Sandbox Code Playgroud)
什么是new关键词技术上在这里做什么?它是否正在创建一个新功能?或者是创建一个新对象并将该函数应用于它?
如果是这样,那么这是一种创建"Box"的方法,这是否意味着this关键字实际上是指对象myBox?