什么是PHP或JavaScript中的Closures/Lambda外行术语?一个例子对我的理解很有帮助.我在讨厌Lambda和Closures是一回事吗?
例如,我有以下代码:
function a($param)
{
function b()
{
echo $param;
}
b();
}
a("Hello World!");
Run Code Online (Sandbox Code Playgroud)
抛出E_NOTICE错误,因为$ param当然是未定义的(在b()中).
我无法将$ param传递给b(),因为b()应该是preg_replace_callback()的回调函数.所以我有想法在$ GLOBALS中保存$ param.
有没有更好的解决方案?
我正在努力解决这个难题的Javascript OOP问题.
所以我有以下课程:
var ClassA = function() {
this.initialize();
}
ClassA.prototype = {
methods : ['alpha','beta','gama'],
initialize : function() {
for ( var i in this.methods ) {
this[this.methods[i]] = function() {
console.log(this.methods[i]);
}
}
}
}
var a = new ClassA();
Run Code Online (Sandbox Code Playgroud)
当我调用每个方法时,我希望打印出它的名字,对吧?但这是我得到的:
a.alpha(); // returns gama ?!?
a.beta(); // returns gama ?!?
a.gama(); // returns gama
Run Code Online (Sandbox Code Playgroud)
但是当我的班级看起来像这样:
var ClassB = function() {
this.initialize();
}
ClassB.prototype = {
methods : ['alpha', 'beta', 'gama'],
initialize: function() {
for ( var i …Run Code Online (Sandbox Code Playgroud) 我最近偶然发现了一个名为Overlay101的网站,它允许您为其他网站创建游览.
我很有兴趣看到他们用来加载第三方网站进行编辑的技术.
当您键入网站的地址时,它将作为overlay101.com网站的子域加载.
例如,如果我键入https://stackoverflow.com/questions/111102/how-do-javascript-closures-work- 它被加载为http://stackoverflow.com.www.overlay101.com/questions/111102/how-do-javascript-closures-work
我想知道如何实现子域创建,我在页面的源代码中看到了注入的JavaScript.我想知道这是怎么可能的.
最让我感兴趣的是Stackoverflow.com不允许在框架内加载页面 - 我想知道他们是如何设法加载页面的,以便可以添加游览弹出窗口.
这个问题是精心提炼的非异步函数版本,作为jQuery Deferred执行.
我们有2个jsfiddles:
http://jsfiddle.net/XSDVX/1/ - 尽管调用了notify()函数,但不会触发progress事件.
http://jsfiddle.net/UXSbw/1/ - 这里按预期触发进度事件.
唯一的区别是一行代码:
setTimeout(dfd.resolve,1);
Run Code Online (Sandbox Code Playgroud)
与
dfd.resolve();
Run Code Online (Sandbox Code Playgroud)
问题是:
当我们延迟解决时,如何捕获在此回调返回之前调用的.notify?想一想..then获取从它的第一个参数返回的延迟对象,并从中创建一个新的延迟对象,绑定到它完成的进度和失败事件.如果在返回deferred之前调用了notify,那么即使使用setTimeout,如何捕获它呢?(感谢/sf/users/28045811/询问此问题)
我可以摆脱setTimeout()并仍然有进展回调被解雇?
我想我错过了关于javascript非常重要的事情
var gl = 10
$(document).ready(function() {
var obj = {}
obj.test = function() {
gl++
var lc = gl
function y() {
alert('local = ' + lc)
}
(function() {
var k = lc + 1
$('#button').click(function() {
alert('local anonymous = ' + k)
y()
})
})();
}
obj.test()
$('#button').off()
obj.test()
})
Run Code Online (Sandbox Code Playgroud)
在上面的场景中,我定义了一个对象'obj',并为该对象创建了一个方法'test'.在方法内部,我有一个本地函数'y()',由附加到按钮的'click'事件使用.click事件也附加在匿名函数中.
然后我调用'test()',从按钮取消订阅'click'事件并再次调用'test()'.在结果中,我收到local = 12和local anonymous = 13.
但是我不明白javascript在内存中的作用,尤其是在每个步骤上运行'y()'和匿名函数.
我的具体问题如下,但如果您能解释整个流程,我将非常感激.
所以当我释放引用第一个'obj.test()'的所有事件时.在这种情况下,我猜这只是'点击'事件.javascript会破坏'obj.test()'范围和所有函数,包括匿名函数范围吗?我需要关心其他事情吗?
我的用例:我正在创建具有不同页面行为的动态页面加载,所以我想在全局对象方法中为每个页面分离javascript,并且一旦加载新页面,我想要分离上一页面的所有事件并调用行为功能.但是我突然意识到我并不真正理解javascript是如何工作的,并且这种方法可能存在巨大的内存泄漏.: - )
非常感谢!
我需要从CLASS启动自定义事件.我知道用DOM对象和jquery做这个,使用triggerHandler,比如$(object).. triggerHandler("inputChange",{param:X}); 问题是当我尝试使用类时,如下所示:
var MyClass = (function(){
var static_var = 1;
var MyClass = function () {
var privateVar;
var privateFn = function(){ alert('Im private!'); };
this.someProperty = 5;
this.someFunction = function () {
alert('Im public!');
};
this.say = function() {
alert('Num ' + this.someProperty);
$(this).triggerHandler("eventCustom");
}
this.alter = function() {
this.someProperty ++;
}
};
return MyClass;
})();
TheClass = new MyClass();
$(TheClass).on('eventCustom', function() {
alert('Event!');
});
TheClass.say();
Run Code Online (Sandbox Code Playgroud)
这不会启动警告或错误,但事件侦听器不起作用(或者不调度事件).我认为jQuery事件系统不适用于不是DOM对象,对吗?
启动事件的任何其他方式(我需要事件,而不是针对我的特定情况的回调)?
非常感谢!
我对javascript很新,最近在了解闭包时我遇到了一个问题,面试官问: -
function initButtons() {
var body = document.body,
button, i;
for (i = 0; i < 5; i++) {
button = document.createElement("button");
button.innerHTML = "Button " + i;
button.addEventListener("click", function (e) {
alert(i);
}, false);
body.appendChild(button);
}
}
initButtons();
Run Code Online (Sandbox Code Playgroud)
这段代码会输出什么?我回答了 - "对应于按钮的数字...... 1,2等"
好的,然后我用Google搜索并找到答案,其中说:
发生这种情况的原因是因为在for循环的每次迭代期间调用addEventListener方法时会创建一个闭包.
好的,现在一切都在我头顶......这怎么可能?坦率地说,我是一个愚蠢的JavaScript,并试图尽可能多地学习.所以,我要通过基础知识!
同时我也在阅读关于如何做javascript-closures-work的细节
我不知道内部函数如何从.sort()方法传递参数.我知道.sort()传递值createComparisonFunction(),但它们如何最终在内部函数中?它只是从外部函数中获取任何未使用的参数吗?
我想了解这种行为.
function createComparisonFunction(propertyName) {
return function(object1, object2){
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if (value1 < value2){
return -1;
} else if (value1 > value2){
return 1;
} else {
return 0;
}
};
}
var data = [{name: "Zachary", age: 28}, {name: "Nicholas", age: 29}];
data.sort(createComparisonFunction("name"));
alert(data[0].name); //Nicholas
data.sort(createComparisonFunction("age"));
alert(data[0].name); //Zachary
Run Code Online (Sandbox Code Playgroud) 我知道两者都是返回函数的函数.
到目前为止,我使用thunk的经验一直在使用它们返回函数而不仅仅是动作对象,这样我就可以使用异步请求Redux.
闭包是一个高阶函数(HOF)的实现,以便为私有变量创建一个新的范围......对吗?HOFs的其他例子包括map,reduce和filter.
有没有其他明确定义两者之间差异的东西?
谢谢.
javascript functional-programming thunk higher-order-functions redux