我在JQuery中注意到使用了以下代码结构
(function(){var l=this,g,y=l.jQuery,p=l.$,...})()
这似乎创建了一个功能,并称之为.
采用这种方法与内联函数的内容相比有什么好处?
有没有办法可以隐含地将顶级变量声明为闭包中使用的全局变量?
例如,如果使用如下代码:
$a = 0; //A TOP-LEVEL VARIABLE
Alpha::create('myAlpha')
->bind(DataSingleton::getInstance()
->query('c')
)
->addBeta('myBeta', function($obj){
$obj->bind(DataSingleton::getInstance()
->query('d')
)
->addGamma('myGamma', function($obj){
$obj->bind(DataSingleton::getInstance()
->query('a')
)
->addDelta('myDelta', function($obj){
$obj->bind(DataSingleton::getInstance()
->query('b')
);
});
})
->addGamma('myGamma', function($obj){
$a++; //OUT OF MY SCOPE
$obj->bind(DataSingleton::getInstance()
->query('c')
)
.
.
.
Run Code Online (Sandbox Code Playgroud)
从这样的方法调用闭包:
public function __construct($name, $closure = null){
$this->_name = $name;
is_callable($closure) ? $closure($this) : null;
}
Run Code Online (Sandbox Code Playgroud)
所以在summary/TL; DR中,有没有一种方法可以隐式地将变量声明为全局,以便在不使用global关键字或$GLOBALS超全局的闭包(或其他函数)中使用?
我在另一个频繁的论坛上开始讨论这个话题(http://www.vbforums.com/showthread.php?p=3905718#post3905718)
在下面的匿名子例程声明中,Perl似乎将其解析为间接方法调用,而不是作为子例程:
use 5.010;
use strict;
use warnings;
sub proxy {
my $new = shift;
say "creating proxy: $new";
sub :lvalue {
say "running proxy: $new";
tie my $ret, 'Some::Package', shift, $new;
$ret
}
}
say "before";
my $p1 = proxy '_value';
say "p1 declared: $p1";
my $p2 = proxy 'value';
say "p2 declared: $p2";
Run Code Online (Sandbox Code Playgroud)
打印:
before creating proxy: _value running proxy: _value Can't locate object method "TIESCALAR" via package "Some::Package" ...
如果a return或者my $sub =之前添加sub :lvalue …
有没有一种方法可以将对象上下文传递给匿名函数而不$this作为参数传递?
class Foo {
function bar() {
$this->baz = 2;
# Fatal error: Using $this when not in object context
$echo_baz = function() { echo $this->baz; };
$echo_baz();
}
}
$f = new Foo();
$f->bar();
Run Code Online (Sandbox Code Playgroud) 是否可以在SML中编写递归匿名函数?我知道我可以使用fun语法,但我很好奇.
我写过,作为我想要的一个例子:
val fact =
fn n => case n of
0 => 1
| x => x * fact (n - 1)
Run Code Online (Sandbox Code Playgroud) 我正在使用匿名函数,我在对象之外创建匿名函数,然后将其添加到稍后将与__callStatic魔术函数一起使用的对象中.要添加的闭包包含父类的方法.我想知道我是否能够从闭包中调用这些方法?
现在我收到此错误:
EmptyObject::addMethod('open', function(){
if (static::_hasAdapter(get_class(), __FUNCTION__))
return self::_callAdapter(get_class(), __FUNCTION__, $details);
echo '<p>You have mail!</p>';
});
Run Code Online (Sandbox Code Playgroud)
抛出此错误:
致命错误:当没有活动类范围时,无法访问static ::
和
//Add the functions
EmptyObject::addMethod('open', function(){
if (EmptyObject::_hasAdapter('EmptyObject', __FUNCTION__))
return EmptyObject::_callAdapter('EmptyObject', __FUNCTION__, $details);
echo '<p>You have mail!</p>';
});
Run Code Online (Sandbox Code Playgroud)
抛出此错误,因为该方法受到保护
致命错误:在类EmptyObject中找不到带有消息'Method'ahasAdapter'的未捕获异常'BadMethodCallException'
旧方式:
var self = this;
setTimeout(function(){
console.log(self);
}, 5000);
Run Code Online (Sandbox Code Playgroud)
使用jQuery:
setTimeout($.proxy(function(){
console.log(this);
}, this), 5000);
Run Code Online (Sandbox Code Playgroud)
使用绑定:
setTimeout((function(){
console.log(this);
}).bind(this), 5000);
Run Code Online (Sandbox Code Playgroud)
随叫随到:
setTimeout((function(){
console.log(this);
}).call(this), 5000);
Run Code Online (Sandbox Code Playgroud)
似乎申请也有效:
setTimeout((function(){
console.log(this);
}).apply(this), 5000);
Run Code Online (Sandbox Code Playgroud)
我想知道这些方法之间是否存在任何不那么明显的差异
假设我有一个匿名的PHP函数,如下所示:
<?php
$l = function() { echo "hello world"; };
Run Code Online (Sandbox Code Playgroud)
是否有可能获得匿名函数的字符串表示$l,即包含函数体的字符串?
我试了几件事:
echo $l; PHP Catchable致命错误:类Closure的对象无法转换为字符串var_dump($l); 类闭包#1(0){}echo $l->__toString();:调用未定义的方法Closure :: __ toString()get_class_methods($l)返回array('bind', 'bindTo'),所以似乎没有未记录的方法$r = new ReflectionClass($l);:getProperties(),getConstants()和getStaticProperties()都是空的,也$r->__toString()没有返回任何有用的东西.我在代码中并不需要这个,我只是认为如果出现问题可能对日志记录有用.在我无法自己提出解决方案后,我很好奇是否有可能.
我正在尝试等待,然后在数组中的所有图像都已完成加载(使用.complete)时收到消息,根据此处的答案.因此我设置了如下的无限循环.但是,当我运行这个时,我得到一个错误,即没有定义checkForAllImagesLoaded().这段代码正在通过书签运行,因此它全部包含在一个匿名函数结构中(如下所示).如果我在该构造之外重新定义我的函数和变量,它就可以工作.但这似乎是编写bookmarklet的一种糟糕方式.我怎样才能解决这个问题,以便在setTimeout之后仍能识别该函数?
(function() {
//var images = array of images that have started loading
function checkForAllImagesLoaded(){
for (var i = 0; i < images.length; i++) {
if (!images[i].complete) {
setTimeout('checkForAllImagesLoaded()', 20);
return;
}
}
}
checkForAllImagesLoaded();
})();
Run Code Online (Sandbox Code Playgroud) 我想知道Delphi中是否有一种方法可以为表单控件事件分配匿名方法.
例如:
Button1.OnClick := procedure (Sender: TObject) begin ShowMessage('') end;
Run Code Online (Sandbox Code Playgroud)
当然这给了我一个错误
[dcc32错误] Control.Controller.pas(51):E2009不兼容的类型:'方法指针和常规程序'
这是因为该方法必须属于一个对象,但它不再是匿名的.
也许有一些解决方法