2014-09-25 51 views
0

我想了解为什么这是返回窗口而不是我的对象。看看我以前的例子,这是工作。我必须失去一些明显的东西。 Javascript'这个'返回窗口,而不是我的对象

(function($) { 
 
    if (typeof a === "undefined" || a === null) a = {}; 
 
    if (typeof a.b === "undefined" || a.b === null) a.b = {}; 
 
    if (typeof a.b.c === "undefined" || a.b.c === null) a.b.c = {}; 
 
    if (typeof a.b.c.d === "undefined" || a.b.c.d === null) a.b.c.d = {}; 
 
    if (typeof a.b.c.d.e === "undefined" || a.b.c.d.e === null) a.b.c.d.e = {}; 
 

 
    a.b.c.d.e.MyObject = { 
 
    method1: function() { 
 
     console.log(this); //Returning Window 
 
    }, 
 

 
    method2: function() { 
 

 
    } 
 
    } 
 
}(jQuery));

这是正在通过的eval()从另一个JS文件调用。

+8

您尚未显示如何调用'method1'。这可能会使所有区别... – 2014-09-25 17:07:01

+0

页面加载时有一个调用a.b.c.d.e.MyObject.method1 – mgoodric 2014-09-25 17:09:15

+1

如果这是因为你做了像'window.onload = a.b.c.d.e.MyObject.method1;'那么这就是问题所在。 'this'的值由函数**调用**的方式确定,而不是按照定义的方式确定。 – Pointy 2014-09-25 17:10:31

回答

0

感谢@Lee Tayor和@Pointy,我找到了解决我的问题的方法。既然我能控制哪些正在通过的eval()调用叫,我修改了EVAL调用下面:

function initMyObject() { 
 
    a.b.c.d.e.MyObject.method1(); 
 
}

0

我想你已经有答案了,但我认为你应该拿一个看看JS对象的创建方式。 如果您使用的是eval,除非您真的知道您在做什么,否则我会强烈建议您不要这样做。
要创建一个对象使用:

var MyClass = function() { 
    this.attr = 'Hello World!'; 
} 

var myObject = new MyClass(); //Remember the new!!!! 

和方法声明如下(创建新对象之前做到这一点):

MyClass.prototype.myMethod = function() { 
    return this.attr; 
} 

这样,“this”将引用对象,而不是该功能的范围已被执行。 仔细查看JS对象,参见JavaScript: The Good Parts以获得与js一起使用的一些良好实践

+0

我知道eval的含义,不幸的是我写的代码正在集成到现有的框架中,并且我无法修改核心产品。 – mgoodric 2014-09-25 18:43:48

+0

运气不好。希望对象定义有所帮助 – donnanicolas 2014-09-25 18:50:14

相关问题