我正努力成为一个好公民,并尽可能地远离全球范围.有没有办法访问不在全局范围内的setTimeout变量?
那么,在这个例子中,有人会如何取消'计时器'?
myObject.timedAction = (function(){
var timer;
return function(){
// do stuff
// then wait & repeat
timer = setTimeout(myObject.timedAction,1000);
};
})();
Run Code Online (Sandbox Code Playgroud)
我已经尝试过clearTimeout(myObject.timedAction.timer,1000);(没有成功),也不确定还有什么可以尝试.
我在理解联合中命名空间和模块的目的时遇到了问题.例如,我有一个班级Game.utils.Matrix.我想Game作为命名空间,utils作为模块和Matrix类来注释:
/**
* @namespace Game
*/
/**
* @module utils
* @memberOf Game
*/
/**
* Create a matrix
* @constructor
*/
function Matrix(){}
Run Code Online (Sandbox Code Playgroud)
它创建了一个文档,并且Matrix该类的名称路径是Game.utils~ Matrix,但如果我按照Module链接,其名称路径Module: utils没有Game名称空间前缀,如果我按照Game链接它不包含utils模块链接.
此外,我无法向此模块添加另一个类,因为此类未显示在utils模块选项卡中:
/**
* Create Dictionary
* @memberOf Game.utils
* @constructor
*/
function Dictionary(){}
Run Code Online (Sandbox Code Playgroud)
问题是:记录命名空间和模块的正确方法是什么?每个命名空间和模块的用例是什么?
我永远忽略了javascript.几年前我开始使用jQuery,所以我可以顺利通过.但是当我开始做TDD时,我决定昨天真正深入了解javascript(之后可能还有coffeescript).
在我的ASP.NET Web窗体应用程序中,我有很多页面,目前大多数页面都没有大量的javascript.我正在改变这一点.我正在使用Jasmine和Chutzpah来创建我的测试.
我正在按照我的测试通过并按预期失败.但后来我想创建一个名称空间,所以我不会在全球范围内踩踏.
阅读本文后:http: //enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-1/
我决定尝试使用本文的自执行匿名函数:第2部分(公共和私有)部分中的模式.它似乎具有最大的灵活性,似乎很好地封装了一些东西.
我有一个名为/ Scripts的文件夹.在该文件夹下是我正在使用的一些框架,如jQuery,jasmine,(twitter)bootstrap和modernizr.我还有一个名为/ Site的子文件夹,我根据页面将我的代码放在多个文件中.(product.js,billing.js等)
在/ Scripts/Site下我向/ Tests(或Specs)添加了一个子文件夹,其中包含文件(product_test.js,billing_tests.js等).
没有命名空间一切都很好.我有一个用padLeft帮助函数创建的utility.js文件.然后我在另一个.js文件中使用了全局padLeft.我的测试都奏效了,我很高兴.然后我决定找出命名空间并将我的Scripts/Site/utility.js更改为:
(function (myns, $, undefined) {
//private property
var isSomething = true;
//public property
myns.something = "something";
//public method
myns.padLeft = function (str, len, pad) {
str = Array(len + 1 - str.length).join(pad) + str;
return str;
};
//check to see if myns exists in global space
//if not, assign it a new Object Literal
}(window.myns= window.myns|| {}, jQuery ));
Run Code Online (Sandbox Code Playgroud)
然后在我的Scripts/Site/Tests/utility_test.js中
/// <reference …Run Code Online (Sandbox Code Playgroud) 我有一个声明命名空间的js脚本,然后有一个run()我可以在XUL脚本中调用的方法,如myNamespace.run():
var myNamespace = {
run: function() {
var selectedText = getSelText();
alert (selectedText);
var getSelText = function() {
var focusedWindow = document.commandDispatcher.focusedWindow;
var selText = focusedWindow.getSelection();
return selText.toString();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望能够getSelText()在myNamespace.run()不需要声明getSelText()为另一个顶级函数的情况下调用内部myNamespace.相反,它应该像内部的私有方法myNamespace.run().
当我运行此脚本时,我收到一个错误:
getSelText不是一个功能.
我是JavaScript的新手,所以我不知道设计它的最佳方法.是否有可能实现我的目标?我是以错误的方式来做这件事的吗?
感谢任何帮助!
// Define a class like this
function Person(name, gender){
// Add object properties like this
this.name = name;
this.gender = gender;
}
// Add methods like this. All Person objects will be able to invoke this
Person.prototype.speak = function(){
alert("Howdy, my name is" + this.name);
}
// Instantiate new objects with 'new'
var person = new Person("Bob", "M");
// Invoke methods like this
person.speak(); // alerts "Howdy, my name is Bob"
Run Code Online (Sandbox Code Playgroud)
如何定义命名空间?
当我在JavaScript中定义命名空间时,Netbeans给出了一个未声明错误的全局变量,而我认为它不应该.为什么是这样?
演示代码:
var MyNamespace = new function () {
var MyClass = function () {};
MyClass.SOME_CONSTANT = 9; // MyClass not defined
this.MyClass = MyClass; // MyClass not defined
};
Run Code Online (Sandbox Code Playgroud)
我检查了这个代码在IE(文档模式IE 5)和Edge 13中工作.代码是一个模块模式,就像在这个答案中的语法.
编辑:首先声明一个变量可能没用,因为命名空间内的函数有时会改变局部变量而不是公共命名空间中的变量,对不对?不过,我想知道为什么Netbeans会给我一个错误.
我习惯写这样的插件:
;(function($){jQuery.fn.myPlugin=function(options){
var defaults={
'property':value
},
o=$.extend({},defaults,options||{});
// INSERT AND CACHE ELEMENTS
var $Element=$('<div></div>');
$Element.appendTo($('body'));
function funFunction(){
// I have access to $Element!
$Element.hide(500);
};
this.each(function(i){
var $this=$(this);
});
return this;
});};})(jQuery);
Run Code Online (Sandbox Code Playgroud)
我知道它并不完美,这就是为什么我现在正在努力学习命名空间,更好的插件结构/模式.不幸的是,我读过的几本书不经意地逐字引用了jQuery插件创作教程,所以没有多大帮助.该教程似乎将所有内容分开,并没有显示组合的良好示例,这就是为什么我感到困惑.在本教程中,它显示了命名空间示例.
jQuery插件命名空间教程
(function( $ ){
var methods = {
init : function( options ) {
},
show : function( ) {
},
hide : function( ) {
},
update : function( content ) {
}
};
$.fn.tooltip = function( method ) {
// Method calling logic
if ( …Run Code Online (Sandbox Code Playgroud) 我在JavaScript中看到名称空间被定义为:
var AppSpace = AppSpace || {};
Run Code Online (Sandbox Code Playgroud)
和/或
var namespace = {};
Run Code Online (Sandbox Code Playgroud)
谁能告诉我:
AppSpace使用两次?使用下面的代码,除了手动指定之外,有没有办法只导出名称不以下划线开头的函数和变量?
var myapp = myapp || {};
myapp.utils = (function() {
var
CONSTANT_A = "FOO",
CONSTANT_B = "BAR";
function func() {}
function _privateFunc() {}
return {//return all variables and functions whose name does not have the "_" prefix.}
}());
Run Code Online (Sandbox Code Playgroud) 我创建了一个Javascript命名空间,以避免与其他Javascript代码冲突.
var ns = {
init: function() {
$('a').click(this.clickHandler);
},
clickHandler: function() {
// Some code here ..
// The keyword "this" does not reference my "ns" object anymore.
// Now, it represents the "anchor"
this.updateUI();
},
updateUI: function() {
// Some code here ...
}
};
Run Code Online (Sandbox Code Playgroud)
请问,我如何引用我的封闭命名空间?
我有以下代码示例...
$.pg = {
width : 700,
height: 200,
rate: 30
};
Run Code Online (Sandbox Code Playgroud)
有没有一种方便的方法我可以写$ .pg [宽度]而不是$ .pg ['width']来获得700?我将宽度,高度和速率放入pg的重点是,我可以少写.
谢谢
javascript ×10
jquery ×3
namespaces ×2
oop ×2
jsdoc ×1
jsdoc3 ×1
module ×1
netbeans ×1
plugins ×1
settimeout ×1
this ×1
timer ×1
unit-testing ×1
variables ×1