小编Mat*_*y F的帖子

严格违规使用此关键字并显示模块模式

无法获取以下内容以传递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)

我不是这种格式的粉丝,更喜欢将函数名称和命名参数更接近并且声明看起来/感觉更清晰.老实说,我不明白为什么这会引发违规行为 - 在这种模式中没有理由这样做.

javascript strict module-pattern

53
推荐指数
2
解决办法
2万
查看次数

Apache Ant差异 - exec vs apply

谁能告诉我<exec><apply>Apache Ant 之间的区别?

apache ant

29
推荐指数
1
解决办法
2659
查看次数

使用RequireJS,Jasmine和testr进行JavaScript依赖注入

我只是在使用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)

unit-testing dependency-injection requirejs jasmine

8
推荐指数
1
解决办法
2005
查看次数

JavaScript闭包与全局变量

哪种方法最佳,哪种方式可以获得更好的性能?

更新: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

7
推荐指数
1
解决办法
7006
查看次数

将DOM元素包装在JavaScript对象中

我已经注意到我一直在编写的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)

javascript constructor dom javascript-objects

7
推荐指数
1
解决办法
3690
查看次数

JavaScript:词汇封闭还是其他什么?

考虑这个脚本:

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)

javascript

6
推荐指数
1
解决办法
353
查看次数

模拟TDD JavaScript的用户输入

我发现使用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事件?

javascript tdd unit-testing jasmine

6
推荐指数
1
解决办法
7546
查看次数

如何从通用适配器调用notifyDataSetChanged()

一个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.

android listview adapter listadapter

4
推荐指数
2
解决办法
2万
查看次数

Backbone.js视图是一个简单的选择列表

我已经构建了一个支持Backbone的库,允许用户添加/删除项目,就像Todos示例一样.

每次添加或删除项目时 - 或者刷新整个集合 - 我需要在页面的其他区域上另外选择两个选项元素,以便将最新项目作为选项重新填充.如何实现,我只是重新填充视图的render函数中的select元素,该元素包含对集合的引用?

我很想为选择选项创建一个视图,但这似乎有些过分,特别是在考虑视图不需要重新处理任何事件时.其他视图使用选择选项来填充表单数据.

javascript model-view-controller backbone.js

4
推荐指数
1
解决办法
2656
查看次数

使用Date作为哈希表键

如何在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

3
推荐指数
1
解决办法
3873
查看次数