2013-12-09 66 views
0

考虑以下对象:错误,它失去范围

var data = { 
    el : $('.element'), 
    value1 : this.el.data('value1') 
} 

为什么this失去范围是什么?并抛出一个错误?

我可以做到以下几点,但它不是有效的,因为我基本上选择的div两次:

var data = { 
    el : $('.element'), 
    value1 : $('.element').data('value1') 
} 

这适用于功能:

var data = { 
     el : $('.element'), 
     test : function() { 

     console.log(this.el) // works 
    } 

} 
+3

它完全没有损失范围,它根本不是你想象的那样。你还没有改变范围,你使用'this'的范围与'var data = {' –

+1

之前的行相同只是试图澄清你的范围问题。 当你定义“数据”时,“这个”范围仍然是全局范围..数据尚未定义。 javascript引擎会在数据完全评估之前尝试评估this.el.data('value1'),因此这只是对数据的引用。 –

回答

0

使用它像

var data = { 
    el : $('.element'), 
    value1 : function() { 
     return this.el.data('value1')  
    } 
} 
console.log(data.value1());//foobar 
console.log(data.value1.call({}));//error 

var data = { 
    el : $('.element'), 
    value1 : function() { 
     return data.el.data('value1')  
    } 
} 
console.log(data.value1());//foobar 
console.log(data.value1.call({}));//foobar 

在第二种方法中,即使您调用任何范围内的函数,该值也将始终指向数据

+0

这是否有效,我不确定这是如何工作的 - 将对象引用到自身? – webmasters

+0

如果你想在任何函数范围内调用data.value,并且想要将'this'作为你可以使用的数据。 – Sarath

+0

这不起作用,'data'在这一点上仍然是未定义的。 HTTP://的jsfiddle。net/Nhfdn/ –

3

试试这个:

var $element = $('.element'); 
var data = { 
    el : $element, 
    value1 : $element.data('value1') 
} 

this不属于jQuery的,当你选择使用jQuery的元素不会在你的范围内改变thisthis基本对象其中包含您所使用的函数。有时候会有一些将this转换为DOM元素的jQuery方法,您需要阅读文档以了解您正在使用的任何方法。我们无法确定this来自这段代码,因为它不包含函数。

0

做这个

el = $('.element'); 
var data = { 
    el : el, 
    value1 : el.data('value1') 
} 

无论如何,这看起来奇怪,也许一些更多的上下文可以帮助它更好看(你为什么会传递一个jQuery对象,它的对象上的价值时,你可以得到价值?jQuery对象)

+0

数据对象会有很多属性和方法 - 如果我这样做,el会在全局声明,这在复杂的应用程序中不是很好 - 比如使用主干js – webmasters

1

另一种选择,我想会是这样:

var data = { e : $('.element'), value1: function(){return this.e.data();} }

我不是真正的快乐该解决方案,但它会完全封装内部的数据

1

这里的一切就是我刚才试过:

你觉得呢?

var data = { 
    el : $('.element'), 
    initialize: function() { 

    this.mydata = this.el.data('mydata'); 
    } 
} 
+0

这很好,因为它允许你根据需要重新初始化它,但是,我认为我更喜欢使'mydata'成为返回数据的函数。给他自己的。 –