允许JavaScript闭包从父对象';s范围
我可以将一个变量从父作用域传递到匿名函数,如下所示:允许JavaScript闭包从父对象';s范围,javascript,scope,closures,anonymous-function,Javascript,Scope,Closures,Anonymous Function,我可以将一个变量从父作用域传递到匿名函数,如下所示: var f = function(myVar) { alert(myVar); } f('hello'); 我不希望这样做,而是允许闭包直接访问父对象的范围 PHP允许我这样做,如所述。例如,通过使用use($message),父对象的$message变量在闭包中可用 闭包也可以从父范围继承变量。任何这样的 必须将变量传递给使用语言构造 示例#3从父范围继承变量 // Inherit $message $example = func
var f = function(myVar) {
alert(myVar);
}
f('hello');
我不希望这样做,而是允许闭包直接访问父对象的范围
PHP允许我这样做,如所述。例如,通过使用use($message)
,父对象的$message
变量在闭包中可用
闭包也可以从父范围继承变量。任何这样的
必须将变量传递给使用语言构造
示例#3从父范围继承变量
// Inherit $message
$example = function () use ($message) {
var_dump($message);
};
$example();
如何使用JavaScript执行此操作
我正在努力解决的具体部分是下面脚本的这一部分
select: function(e, ui) {
//...
if (typeof options.autocomplete.select !== "undefined"){
options.autocomplete.select();
}
}
select: function() {
//How can I access editable, elem, and ui. It shows each as being undefined yet I can access it in the parents scope
}
当执行脚本时,它将它们显示为未定义,但我看到它们是由父作用域中的myconsole.log
定义的
此外,如果我使用options.autocomplete.select(可编辑,ui,elem)显式地传递它们代码>,我可以访问它们
完整脚本:
xWrap(dialog.find('a.car'),'autocomplete',chartsId, {name:'carId', title:'Car Name', autocomplete: {
url: "/1.0/cars",
params: {term:null, fields:['id','name']},
select: function(editable, elem, ui) {
console.log('chart-list select','editable',editable,'elem',elem,'this',this,'ui', ui)
var $td=$(elem).parent()
var series = $td.closest('table').find('th').eq($td.index()).data('id');
var category=$td.parent().data('id');
editable.option('params', {'carId': ui.item.id});
editable.option('url', '/1.0/cars/'+carId+'/'+series+'/'+category)
}
}});
$.fn.xEdit = function(type, options) {
//console.log('xEdit',this,type, options);
function chk(o, a) {
for (var i = 0; i < a.length; i++) {
if (typeof o[a[i]] === "undefined"){
$.error('Property "' + a[i] + '" must be provided to jQuery.xEdit');
}
}
}
var common={
placement: 'right',
ajaxOptions: {type: "PUT"},
send: 'always'
// pk: null, title: null, params: {name: null}, url: null, //Must be passed
}
if (typeof options.name === "undefined"){
$.error('Property "name" must be provided to jQuery.xEdit');
}
options.params={name: options.name};
delete(options.name);
switch(type) {
case 'text':
options.type='text';
chk(options,['pk','title','url']);
this.editable($.extend({}, common, options));
break;
case 'select':
options.type='select';
chk(options,['pk','title','url', 'source']);
this.editable($.extend({}, common, {value: null}, options));
break;
case 'autocomplete':
options.type='text';
chk(options,['pk','title','url','autocomplete']);
chk(options.autocomplete,['url','params']);
this.editable($.extend({}, common, {value: null}, options))
.on('shown', function(e, editable) {
//console.log('on.show','this',this,'e',e,'editable',editable)
var elem=this; //Needed only for rare case
var $input=editable.input.$input.val('');
var $button=$input.parent().next().find('button.editable-submit').css('opacity', 0.3)
.bind('click.prevent', function() {return false;});
$input.focus(function() {
$button.css('opacity', 0.3).bind('click.prevent', function() {return false;});
})
.autocomplete({
source: function( request, response ) { //get All Points
options.autocomplete.params.term=request.term;
$.getJSON( options.autocomplete.url, options.autocomplete.params, function(json) {
var data=[];
for (var j = 0; j < json.length; j++) {
data.push({id:json[j].id,label:json[j].name});
}
response(data);
} );
},
minLength: 2,
position: { my : "left top+20", at: "left bottom" },
select: function(e, ui) {
console.log('xEdit select','editable',editable,'elem',elem,'this',this,'ui', ui, 'options', options)
$input.blur();
$button.css('opacity', 1).unbind('click.prevent');
if (typeof options.autocomplete.select !== "undefined"){
options.autocomplete.select(editable, elem, ui,);
}
}
})
.autocomplete('widget').click(function() {return false;});
});
break;
default: $.error('Type "' + type + '" is not available for jQuery.xEdit');
}
};
xWrap(dialog.find('a.car'),'autocomplete',chartsId,{name:'carId',title:'car name',autocomplete:{
url:“/1.0/cars”,
参数:{term:null,字段:['id','name']},
选择:功能(可编辑、元素、用户界面){
log('chart-list select','editable',editable,'elem',elem,'this',this,'ui',ui)
var$td=$(elem.parent())
var series=$td.closest('table')。find('th')。eq($td.index())。data('id');
var category=$td.parent().data('id');
option('params',{'carId':ui.item.id});
可编辑。选项('url'、'/1.0/cars/'+carId+'/'+series+'/'+category)
}
}});
$.fn.xEdit=函数(类型、选项){
//log('xEdit',this,type,options);
函数chk(o,a){
对于(变量i=0;i
您已经可以从封闭范围访问变量:
设foo=3;
功能条(){
console.log(foo);
}
bar()代码>您已经可以从封闭范围访问变量:
设foo=3;
功能条(){
console.log(foo);
}
bar()代码>全局变量
var myVar=“你好”;
函数f(){
console.log(myVar);
}
函数myMainFn(){
f();
}
myMainFn()代码>全局变量
var myVar=“你好”;
函数f(){
console.log(myVar);
}
函数myMainFn(){
f();
}
myMainFn()代码>我的错。我没有说明foo
和bar()
不在同一范围内定义。也许没关系?我以为我观察到了。我最好再做一些测试。我又测试了一次,但仍然无法访问变量。我刚刚发布了我遇到问题的实际脚本。为什么可以