我正在尝试创建一个动态构建自己的getter和setter的对象:
function Person( properties ) { // 'properties' is an object literal
this._private = properties; // private by convention
for ( key in this._private ) {
this[key] = function() {
return this._private[key];
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望,这会产生这样的东西:
var jack = new Person({
working:true,
age:33,
gender:'male'
});
jack.working() --> true
jack.age() --> 33
jack.gender() --> 'male'
Run Code Online (Sandbox Code Playgroud)
问题是,它总是返回'男性',如下所示:
jack.working() --> 'male'
jack.age() --> 'male'
jack.gender() --> 'male'
Run Code Online (Sandbox Code Playgroud)
我错过了什么?哦,这只是一个概念证明.我知道这不是用JavaScript创建getter和setter的完美解决方案.
我正在附加一个引用 at javascript 和样式表的子元素,但是当不再使用它时,我想再次删除它。
var head = document.getElementsByTagName('head')[0];
// We create the style
var style = document.createElement('link');
style.setAttribute("rel", "stylesheet");
style.setAttribute("type", "text/css");
style.setAttribute("href", '_css/style.'+app+'.css');
var script = document.createElement('script');
script.setAttribute("type", "text/javascript");
script.setAttribute("src", '_scripts/_js/script.'+app+'.js');
// And the append the style
head.appendChild(style);
head.appendChild(script);
Run Code Online (Sandbox Code Playgroud)
这就是我附加脚本的方式,它完美地工作..但我无法弄清楚如何从 HTML 中的 head 标签中再次删除标签。
有没有人知道如何再次从标题标签中删除标签..我一直在 Stackoverflow 周围搜索,但实际上似乎没有人有这种问题,但如果有人知道还有另一个问题可以回答这个问题,请告诉我..
似乎req和res变量在Express中具有全局范围(例如,无论函数范围如何,这些变量都是可访问的).如何在不引起同时客户端冲突的情况下实现这一目标?
我正在阅读javascript:Douglas Crockford的优点.我很难理解一个特定的例子和作者提供的解释.
例1 :(第38页)
var quo=function (status) {
return {
get_status:function() {
return status;
}
};
};
var myQuo=quo("amazed");
document.writeln(myQuo.get_status());
Run Code Online (Sandbox Code Playgroud)
书中的解释(我不明白这一点.请解释这一部分):
这个quo函数被设计为在没有新前缀的情况下使用,因此名称不是大写的.当我们调用quo时,它返回一个包含get_status方法的新对象.对该对象的引用存储在myQuo中.即使quo已经返回,get_status方法仍然具有对quo的status属性的特权访问权限.get_status无权访问参数的副本.它可以访问参数本身.这是可能的,因为该函数可以访问创建它的上下文.这叫做封闭.
例2(第39页):
//make a function that assigns event handler function to array of nodes
//when you click on a node, an alert box will display the ordinal of the node
var add_the_handlers=function (nodes) {
var helper=function(i) {
return function(e) {
alert(i);
}
};
var i;
for (i=0;i<nodes.length;i++) {
nodes[i].onclick=helper(i);
}
};
Run Code Online (Sandbox Code Playgroud)
我很难理解这段代码是如何工作的,而且函数(e)是做什么的?为什么辅助函数返回函数反过来又不返回任何东西.这让我非常困惑.如果有人能用简单的语言解释,那将会非常有帮助.非常感谢
EDIT:
According to …Run Code Online (Sandbox Code Playgroud) 我一直在更具体地阅读编程的闭包概念,尤其是与Javascript有关的概念.我还没有完全理解它与我多年来一直在写的Javascript代码有什么不同.我也理解递归的概念,但我想知道,闭包和递归是如何相似的?我是否正确理解递归本身就是一种闭包?
关闭:
function init() {
var name = "Stack Overflow";
function displayName() {
alert(name);
}
displayName();
}
init();
Run Code Online (Sandbox Code Playgroud)
递归:
function factorial(num) {
if(num < 0)
return -1;
else if(num == 0)
return 1;
else
return (num * factorial(num - 1));
}
alert(factorial(8));
Run Code Online (Sandbox Code Playgroud)
我想我已经开始明白闭包只不过是在函数中有一个函数,内部函数可以通过作用域访问外部函数.可能会有递归闭包吗?我的意思是,虽然我的递归示例也不是关闭的例子,但它至少会发生吗?我试图理解递归和闭包是如何相似,不同,或者它们是否可以被所有人比较.有没有例子可以描述这个?
我的函数运行正常但我希望它重复运行:
$('button').click( function(){
setInterval(magicWords(7,3), 1000);
});
Run Code Online (Sandbox Code Playgroud)
我尝试在函数本身中硬连接参数并运行参数 -但是它仍然是一个不行......?
我需要做以下任务.但是这总是仅警告"5"而不是1,2,3,4和5.我该如何解决这个问题?请帮忙.
for(var x=1; x<=5; x++){
something.load(function(result){
alert(x);
});
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在函数中为自己分配一个变量,如果变量与函数的参数同名,它似乎不起作用,但如果它们不是同一个名称.代码示例更清楚地显示了这一点.
我应该期待这种行为吗?这是我的d3用例的一个简化示例,它提示了这个问题.我也在下面展示过.
非工作的例子
var a;
function assign(a) {
a = a;
}
assign("test")
console.log(a)
Run Code Online (Sandbox Code Playgroud)
未定义
工作实例
var a;
function assign(b) {
a = b;
}
assign("test")
console.log(a)
Run Code Online (Sandbox Code Playgroud)
测试
用例
var data
d3.csv("data.csv", function(error, data) {
//Doesn't work for me
data = data
}
console.log(data)
Run Code Online (Sandbox Code Playgroud)
未定义
有一些关于JS中的对象,执行上下文,我不明白.
当我们创建一个对象时,它是否创建了一个执行上下文?因为在调用函数时会创建执行上下文.如果没有,那么对象就像实际执行上下文中的其他变量一样?
谢谢.
我一直在努力学习关闭,但有一件事仍困扰着我.如果我有以下代码:
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add();
add();
add();
// Returns "3"
Run Code Online (Sandbox Code Playgroud)
如果我调用add()三次,为什么不每次都将counter设置为零,然后返回一个递增计数器的匿名函数?一旦自动调用函数运行,它是否会跳过它?对不起,如果问题看起来很简单,我很难理解它.任何帮助将不胜感激.