好吧,首先我应该问一下这是否依赖于浏览器.
我已经读过,如果找到一个无效的令牌,但代码段在该无效令牌之前有效,则在令牌之前插入分号(如果前面有换行符).
但是,由分号插入引起的错误引用的常见示例是:
return
_a+b;
Run Code Online (Sandbox Code Playgroud)
..它似乎不遵循这个规则,因为_a将是一个有效的标记.
另一方面,分解调用链按预期工作:
$('#myButton')
.click(function(){alert("Hello!")});
Run Code Online (Sandbox Code Playgroud)
有没有人对规则有更深入的描述?
当我在一个闭包中将js逻辑写为单个js文件时,一切正常,如下:
(function(win){
//main logic here
win.expose1 = ....
win.expose2 = ....
})(window)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在同一个js文件中的闭包之前插入一个日志备用函数时,
window.Glog = function(msg){
console.log(msg)
}
// this was added before the main closure.
(function(win){
//the former closure that contains the main javascript logic;
})(window)
Run Code Online (Sandbox Code Playgroud)
它抱怨有一个TypeError:
Uncaught TypeError: (intermediate value)(...) is not a function
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
我想知道为什么我的程序输出I4 output\ I3 outputxef\xbc\x9f
var a = 4;\nvar i = 0;\nvar i3 = function() {\n console.log("I3 output")\n return i = i + 3\n}\nvar i4 = function() {\n console.log("I4 output")\n return i = 4\n}\n\n(a > 3) && i3() || (a < 5) && i4();\nconsole.log(i)Run Code Online (Sandbox Code Playgroud)\r\n我想要I3 output那时I4 output。为什么这不起作用?
为什么在js上做出这种糟糕的设计?是否有任何特殊原因设计这样的自动分号插入?
这是我的代码,它在chrome中的js中不起作用:
(function(){console.log("abc");})()
(function(){console.log("123");})();
Run Code Online (Sandbox Code Playgroud)
这是错误:
Uncaught TypeError: (intermediate value)(...) is not a function
Run Code Online (Sandbox Code Playgroud)
我知道这段代码的正确版本是:
(function(){console.log("abc");})();
(function(){console.log("123");})();
Run Code Online (Sandbox Code Playgroud)
我只是想知道为什么js语法设计得如此愚蠢.历史原因?
我也添加这个问题作为警告,每个人都尝试使用javascript的自动分号插入,请只需添加;它需要的任何地方,javascript的自动分号插入是垃圾.它没有像你期望的那样工作.
现有的答案对我来说太复杂了,所以我问一个新答案:
另一个看起来不错但不是工作案例2:
x=1
(function(){console.log("123");})()
Run Code Online (Sandbox Code Playgroud) 我如何解构width,height如果它们之前已经声明过?
function test() {
let height
let width
const viewBox = '0 0 24 24'
const sizeArr = viewBox.split(' ')
// ESLint is telling me to destructure these and I don't know how
width = sizeArr[2]
height = sizeArr[3]
}
Run Code Online (Sandbox Code Playgroud) 我在Javascript文件中定义了各种模块:
var module = {/* ... */}
(function(){
console.log('Invoked');
})()
Run Code Online (Sandbox Code Playgroud)
然而,IIFE抛出一个错误:
> TypeError:object不是函数
我试过复制并粘贴IIFE代码,没有问题.
它可能会引起人们的兴趣并节省几个小时,一个讨厌的捆绑问题,eval来自一个文件,而函数来自第二个文件.
eval('console.log(0)')
(function(x){console.log(x)})(1)
Run Code Online (Sandbox Code Playgroud)
将导致:未捕获TypeError:eval(...)不是函数
这是修复
eval('console.log(0)');
(function(x){console.log(x)})(1)
Run Code Online (Sandbox Code Playgroud)
缺少分号,我几次读过JS中的分号,大部分时间都是.
任何评论为什么eval在这种情况下不是一个函数?
javascript ×7
syntax ×2
arrays ×1
automatic-semicolon-insertion ×1
destructure ×1
ecmascript-6 ×1
eval ×1
iife ×1
typeerror ×1