-
Notifications
You must be signed in to change notification settings - Fork 211
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
JavaScript问题集锦(二) #40
Comments
讲得很清楚,手动点赞! 👍 |
2. 关于
|
3.
|
4.
|
5. 当出现垂直滚动条之后,为什么出现了水平滚动条?【css、layout、vw】在测试UI的时候,发现个很有意思的问题:UI一直正常,直到浏览器宽度增加到某个值,出现了水平滚动条。 怀疑是某个元素布局问题,查找,并没找出原因。 用排除法,逐一删除相比线上不同的元素,删除第一个时,UI已经恢复正常,但是反复检查这个元素,并没有什么不对的地方;换第二个删除,UI也恢复正常.... 最终找到原因,删除一个元素时,垂直滚动条消失!滚动条的原因! 继续查找原因才知道:宽度单位 html {
font-size: calc(100vw / 3.75);
} 解决办法: ::-webkit-scrollbar {
width: 0;
height: 0;
display: none;
} 隐藏滚动条即可。 |
1. 从 IIFE 说一说 Expression 和 Statement
IIFE (Immediately Invoked Function Expression) 即立即调用/执行函数表达式。我们常看到(包括某些库中):
上面的即 IIFE 的一种写法,匿名函数会立即执行。下面是一些等价写法:
是不是觉得很熟悉,然后觉得没什么要注意的?那下面问个问题:
它是 IIFE 吗?为什么?Console 中输入会发生什么?单独拎出来这样问是不是有些发懵?
上面的代码运行的话会报错,并且更进一步,单独执行
function(){}
也会报错:下面首先简要解释下原因:
JS 应用是由(无语法错误的) statements 组成的。
当我们单独输入:
function (){}
时,解释器其实期待的是合法的 statement,即一个函数声明。但很抱歉,函数声明必须有 name,所以这里报错了。同理,
function (){}()
是一样的错误原因,因为当解释器首先看到关键字 function 时,它就认为要接收一个函数声明了,但我们并没有满足这个规则。下面的图可以帮助理解:
接下来我们更深入一点,来全面了解下 JS 中的 Statements 和 Expression。
对 expression ,一句话:任意合法的产生值的代码单元都是表达式。所以:
5
this
a = 5
func()
(function () {})
等等都是表达式。更详细的可参考 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators。
对于 statement,我们可以直接看规范 http://es5.github.io/#x12,可以看到 statement 有
等等。其中,我们重点要讲一讲 ExpressionStatement (表达式语句) ,这是我们这个问题的由来。
表达式语句的定义如上,用中文解释下就是 合法的 expression 加上
;
(即expression;
)就是表达式语句了。但是,{
开头的不是,因为会和 BlockStatement 产生歧义function
开头的不是,因为会和 FunctionDeclaration 产生歧义所以你看,一切写在规范里了。
结合规范,我们就知道开头如果是
function
,那么一律按函数定义来解析,不合法就报错;而我们可以通过()
括号/group操作符来避免。同样
{a:1}.a
报错就是因为开头是{
被当作 BlockStatement 解释了,想当作对象那加括号吧:({a:1}).a
。The text was updated successfully, but these errors were encountered: