你能看一下这个:
(function ($) {
$.fn.extend({
grid: function (settings) {
var defaults = {
data: [
['Code','Name','Email','Other'],
[1,'John','john@domain.com','Johny'],
[2,'Bob','bob@domain.com','Bobby'],
[3,'Jenny','jenny@domain.com','Jen'],
[4,'Mary','mary@domain.com','Maryann']
],
test: this.data.length
};
var config = $.extend(defaults, settings);
return this.each(function(){
this.innerHTML = config.data.length;
this.innerHTML += "<br />" + config.test;
});
}
});
}(jQuery));
$('.content').grid();
解释为什么两个结果不同?
同样如何达到预期效果?
答案 0 :(得分:1)
查看this.data
时this.data.length
的内容。它是根据this
匿名函数grid
中jQuery.fn
的值进行评估的。{{1}}。所以它是jQuery.fn.data
。 Function.length是函数的arity(参数个数),它是2(key,value)。
答案 1 :(得分:1)
问题在于,当你调用this.data.length
时,它实际上是在计算jQuery data
函数的长度,而不是defaults
的长度。此外,在defaults.data
被分配之前,您无法计算{{1}}的长度。
看一下这个工作示例:http://jsfiddle.net/w8PG6/1/
答案 2 :(得分:0)
this
不是指正在构建的对象,而是指当前上下文中的this
。在您的情况下this
碰巧有一个名为data
的属性。与:比较:
var foo = {
bar : "bar",
test : this.bar
}
这根本行不通。 foo.test
为undefined
,除非在同一上下文中有var bar
。我认为不可能在同一语句中分配这两个值,因为在完成赋值语句之前,数组不会被分配给任何可以访问的内容。你能做的最好的是:
var defaults = { data : [ ... ] };
defaults.test = defaults.data.length;