变量外部事件处理程序的范围

Pek*_*ica 1 javascript scope ckeditor

我有一个超出我的语言知识的Javascript kerfuffle.

我正在为CKEditor创建一个自定义插件.该插件是一个IFrame,它在CKEditor生成的DIV中打开.

在IFrame中,我正在显示许多图像.如果用户选择其中一个图像,则显示该图像所需的HTML代码将插入到CKEditor中.

动态地这样做是我被困住的地方.我从iframe中连接到CKEditor实例,如下所示:

var CKEDITOR = window.parent.CKEDITOR;    
Run Code Online (Sandbox Code Playgroud)

CKEditor提供了一个"OK侦听器",当单击OK按钮(由CKEDitor呈现)时,它会触发.那个OK听众在IFrame之外.

定义使用静态值的OK侦听器有效:

var okListener = function(ev) {
   this._.editor.insertHtml('<img class="symbol" src="my_static_symbol.gif">');
   CKEDITOR.dialog.getCurrent().removeListener("ok", okListener);
};

// Assign OK listener
CKEDITOR.dialog.getCurrent().on("ok", okListener);
Run Code Online (Sandbox Code Playgroud)

但是当我分配OK监听器时,我还不知道我的返回值,所以我需要做这样的事情:

var okListener = function(ev) {
   this._.editor.insertHtml('<img class="symbol" src="'+my_dynamic_value()+'">');
   CKEDITOR.dialog.getCurrent().removeListener("ok", okListener);
};

// Assign OK listener
CKEDITOR.dialog.getCurrent().on("ok", okListener);
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为my_dynamic_value它在CKEditor的"OK"按钮触发时超出了函数的范围.

我当然可以,每次用户在列表中选择不同的图像时,更新okListener功能并使用硬编码当前值eval.但这对我来说是一种可怕的资源浪费.

有没有我可以使用的范围技巧,所以我可以从okListener()中的iframe访问东西?

我希望这很清楚.如果不是,请评论,我会澄清.

tho*_*rn̈ 5

但这不起作用,因为my_dynamic_value在CKEditor的"OK"按钮触发时超出了函数的作用域.

好.也许它真的不起作用,但解释是错误的.在JavaScript中,变量具有词法范围.这意味着如果my_dynamic_value在声明函数(处理程序)时在范围内,那么它将永远保留在那里.您收到了什么错误消息?