无法获取以下内容以传递jslint/jshint
/*jshint strict: true */
var myModule = (function() {
"use strict";
var privVar = true,
pubVar = false;
function privFn() {
return this.test; // -> Strict violation.
}
function pubFn() {
this.test = 'public'; // -> Strict violation.
privFn.call(this); // -> Strict violation.
}
return {
pubVar: pubVar,
pubFn: pubFn
};
}());
myModule.pubFn();
Run Code Online (Sandbox Code Playgroud)
我理解它是由this函数声明中的使用引起的,但是我读过Crockford写的东西,他说违规是为了防止全局变量污染 - 但这里唯一的全局变量就是我明确定义的变量...... myModule.其他所有东西都保存在直接的功能范围内,我应该可以用它this来引用该模块.
任何想法如何让这种模式通过?
更新:如果我使用函数表达式而不是声明,这似乎工作,即
var pubFn = function () { ...
Run Code Online (Sandbox Code Playgroud)
我不是这种格式的粉丝,更喜欢将函数名称和命名参数更接近并且声明看起来/感觉更清晰.老实说,我不明白为什么这会引发违规行为 - 在这种模式中没有理由这样做.
我只是在使用RequireJS和Jasmine的单元测试策略中寻找依赖注入.我非常喜欢testr背后的想法,我试图按照github中的示例设置testr,但我无法弄清楚出了什么问题.我总是得到错误
错误:模块尚未加载:今天
当testr尝试加载要测试的模块时.
这里有一些背景..
index.html ..
<script data-main="config" src="../../assets/js/libs/require.js"></script>
<script src="vendor/testr.js"></script>
Run Code Online (Sandbox Code Playgroud)
config.js ..
require.config({
// Initialize specs.
deps:["main"],
...
...
});
Run Code Online (Sandbox Code Playgroud)
main.js ..
require([
// Load the example spec, replace this and add your own spec
"spec/today"
], function() {
var jasmineEnv = jasmine.getEnv();
jasmineEnv.execute();
});
Run Code Online (Sandbox Code Playgroud)
spec\today.js ..
describe('Today print', function() {
var date = {}, today;
beforeEach(function() {
date.today = new Date(2012, 3, 30);
today = testr('today', {'util/date': date}); //Here is where the error is thrown …Run Code Online (Sandbox Code Playgroud) 哪种方法最佳,哪种方式可以获得更好的性能?
更新:jsperf.com报道(a)更快@ http://jsperf.com/closure-vs-global-variable
a)使用封闭物
var obj = {
init: function() {
var self = this;
$('#element').click(function() {
self.clickEvent();
});
},
clickEvent: function() {
this.miscMethod();
},
miscMethod: function() {}
};
Run Code Online (Sandbox Code Playgroud)
b)使用全局变量
var obj = {
init: function() {
// removed self=this closure
$('#element').click(this.clickEvent); // simple method handler
},
clickEvent: function() {
obj.miscMethod(); // global variable used
},
miscMethod: function() {}
};
Run Code Online (Sandbox Code Playgroud) 我已经注意到我一直在编写的JavaScript中的一个常见模式,并且想知道是否已经存在一种类似于最佳实践的模式?本质上,它是如何获取DOM元素并将其包装在内部/与JavaScript对象关联.以此示例为例,您需要在Web应用中使用过滤器.您的页面如下所示:
<html>
<head></head>
<body>
<div id="filter"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
然后你就像这样包装元素:
var myFilter = new Filter({
elem: document.getElementById('filter'),
prop: 'stacks-test',
someCallback: function() {
// specify a callback
}
});
Run Code Online (Sandbox Code Playgroud)
和JavaScript(其中spec是传递给构造函数的对象):
var Filter = function(spec) {
this.elem = spec.elem;
this.prop = spec.prop;
this.callback = spec.someCallback;
this.bindEvents();
};
Filter.prototype.bindEvents = function() {
var self = this;
$(this.elem).click(function(e) {
self.updateFeed();
};
};
Filter.prototype.updateFeed = function() {
this.prop; // 'stacks-test'
this.callback();
// ...
// code to interact with other JavaScript objects
// who in turn, update …Run Code Online (Sandbox Code Playgroud) 考虑这个脚本:
function Obj(prop) {
this.prop = prop;
}
var NS = {
strings: ['first','second','third'],
objs: [],
f1: function() {
for (s in this.strings) {
var obj = new Obj(this.strings[s]);
obj.f2 = function() {
alert(obj.prop);
}
this.objs.push(obj);
}
}
}
NS.f1();
NS.objs[0].f2(); // third
NS.objs[1].f2(); // third
NS.objs[2].f2(); // third
Run Code Online (Sandbox Code Playgroud)
不完全是预期的输出,但是当我更新到这个时:
function Obj(prop) {
this.prop = prop;
}
var NS = {
strings: ['first','second','third'],
objs: [],
f1: function() {
for (s in this.strings) {
var obj = new Obj(this.strings[s]);
this.wire(obj); // …Run Code Online (Sandbox Code Playgroud) 我发现使用jQuery或本机元素触发器函数模拟实际用户事件越来越困难.例如,如果您有文本输入并且不希望用户能够添加字符,则可以e.preventDefault()使用事件上的jQuery规范化事件对象进行调用keydown.但是,无法以编程方式验证此测试方案.
即使没有调用,以下测试也会通过,preventDefault因为jQuery keydown触发器不是"真实"事件.
input.val('test').trigger(jQuery.Event({
which: 68
});
expect(input).toHaveValue('test');
Run Code Online (Sandbox Code Playgroud)
如果没有正确的代码,此测试应该失败,因为输入的值应为'testd'(68是'd'的字符代码).
有没有人知道任何方法或库来模拟真实的浏览器UI事件?
一个OnItemClickListenerfor a ListView有以下方法:
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
Run Code Online (Sandbox Code Playgroud)
我想让ListView刷新器后面的适配器,我相信这是通过使用:
BaseAdapter.notifyDataSetChanged()
Run Code Online (Sandbox Code Playgroud)
如何使用方法中的parent参数onItemClick执行此操作?到目前为止,我已经尝试过:
parent.getAdapter().notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
这会抛出一个错误,因为返回的对象是类HeaderViewListAdapter,由于unknown原因不是它的子类BaseAdapter.
我已经构建了一个支持Backbone的库,允许用户添加/删除项目,就像Todos示例一样.
每次添加或删除项目时 - 或者刷新整个集合 - 我需要在页面的其他区域上另外选择两个选项元素,以便将最新项目作为选项重新填充.如何实现,我只是重新填充视图的render函数中的select元素,该元素包含对集合的引用?
我很想为选择选项创建一个视图,但这似乎有些过分,特别是在考虑视图不需要重新处理任何事件时.其他视图使用选择选项来填充表单数据.
如何在JavaSript中创建哈希表对象并使用日期作为键?到目前为止,我有这个:
var eventHash = {};
for (var i = 0, l = events.length; i < l; i += 1) {
eventHash[events[i].date.getTime()] = events[i];
}
Run Code Online (Sandbox Code Playgroud)
然后,当我想找到与今天相关的事件时,我会使用这个:
var event = eventHash[(new Date(2011, 04, 26, 0, 0, 0, 0)).getTime()];
Run Code Online (Sandbox Code Playgroud)
任何人都可以看到这个解决方案的任何陷阱,或有任何改进建议?
javascript ×7
jasmine ×2
unit-testing ×2
adapter ×1
android ×1
ant ×1
apache ×1
backbone.js ×1
constructor ×1
dom ×1
listadapter ×1
listview ×1
requirejs ×1
strict ×1
tdd ×1