为什么我的JavaScript不能在JSFiddle中运行?

Lar*_*bar 113 html javascript jsfiddle

我不知道这个JSFiddle有什么问题.

HTML:

<input type="button" value="test" onclick="test()">
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

function test(){alert("test");}
Run Code Online (Sandbox Code Playgroud)

当我点击按钮时 - 什么也没发生.控制台说"测试未定义"

我已经阅读了JSFiddle文档 - 它说添加了JS代码并添加了<head>HTML代码<body>(所以这个JS代码早于html并且应该工作).

zal*_*lun 98

如果未指定换行设置,则默认为"onLoad".这会导致在加载结果后将所有JavaScript包装在函数运行中.所有变量都是此函数的本地变量,因此在全局范围内不可用.

将包装设置更改为"无包装",它将起作用:

http://jsfiddle.net/zalun/Yazpj/1/

我将框架切换到"No Library",因为你没有使用任何框架.


tva*_*son 60

该函数在负载处理程序中定义,因此在不同的范围内.正如@ellisbben在评论中指出的那样,你可以通过在window对象上明确定义它来解决这个问题.更好的是,改变它以不显眼地将处理程序应用于对象:http://jsfiddle.net/pUeue/

$('input[type=button]').click( function() {
   alert("test");   
});
Run Code Online (Sandbox Code Playgroud)

注意以这种方式应用处理程序而不是内联,可以保持HTML清洁.我正在使用jQuery,但如果你愿意,你可以使用或不使用框架或使用不同的框架.

  • @ tvanfosson-您的解决方案有效,但jsfiddle不使用单独的帧来显示结果; 见http://jsfiddle.net/Yazpj/show/.它最初不起作用的原因是`test`是在`onLoad`函数内定义的; 使用`window.test = function(){/*...*/}`使其工作得非常好. (5认同)

R3t*_*tep 21

还有另一种方法,将函数声明为如下变量:

test = function() {
  alert("test");
}
Run Code Online (Sandbox Code Playgroud)

的jsfiddle


细节

编辑(根据@nnnnnn的评论)

@nnnnnn:

为什么说test =(没有var)会解决它?

定义这样的函数时:

var test = function(){};
Run Code Online (Sandbox Code Playgroud)

该函数是在本地定义的,但是在没有定义函数时var:

test = function(){};
Run Code Online (Sandbox Code Playgroud)

testwindow在顶级范围的对象上定义的.

这为什么有效?

就像@zalun说:

如果未指定换行设置,则默认为"onLoad".这会导致在加载结果后将所有JavaScript包装在函数运行中.所有变量都是此函数的本地变量,因此在全局范围内不可用.

但是如果你使用这种语法:

test = function(){};
Run Code Online (Sandbox Code Playgroud)

您可以访问该功能,test因为它是全局定义的


参考文献:

  • 这真的是最简单的方法,你只是在JSFiddle中测试一小段代码. (2认同)
  • +1这对于jsFiddle中的函数问题很容易解决. (2认同)