首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

避免这7个误区,才能让【宏】削铁如泥

我们知道所有宏定义都将被重新扫描以查找更多要替换宏,如果自引用认为是宏使用,它将产生无限大扩展。 为防止这种情况,自引用不被视为宏调用。它原样传递到预处理器输出中。...举个例子 #define foo a,b #define bar(x) lose(x) #define lose(x) (1 + (x)) 我们预期结果是barfoo)变成(1 +(foo)),...然而barfoo)扩展为loss(a,b)会出错,因为Los需要一个参数。...在这种情况下,该问题可以通过使用相同括号轻松解决,该括号应用于防止算术运算错误嵌套: #define foo (a,b) or #define bar(x) lose((x)) 多余一对括号可防止...foo定义中逗号解释为参数分隔符。

1.2K20

ES6 解构赋值

{a, b} = {a: 1, b: 2} 不是有效独立语法,因为左边 {a, b} 认为是一个块而不是表达式。...然而,({a, b} = {a: 1, b: 2}) 是有效,正如 var {a, b} = {a: 1, b: 2} 你 ( ... ) 表达式之前需要有一个分号,否则它可能会被当成上一行中函数执行参数...语句和表达式区别在于,前者主要为了进行某种操作,一般情况下不需要返回值;后者则是为了得到返回值,一定会返回一个值。凡是 JavaScript 语言中预期为值地方,都可以使用表达式。...比如,赋值语句等号右边,预期是一个值,因此可以放置各种表达式。 语句以分号结尾,一个分号就表示一个语句结束。多个语句可以写在一行内。...var o = {p: 42, q: true}; var {p: foo, q: bar} = o; console.log(foo); // 42 console.log(bar); // true

35820
您找到你想要的搜索结果了吗?
是的
没有找到

你真的了解JS函数吗?

(){}是作为赋值表达式一部分的话,那它就是一个函数表达式 如果function foo(){}包含在一个函数体内,或者位于程序最顶部的话,那它就是一个函数声明。...比如 // 声明,因为它是程序一部分 function foo(){} //表达式,因为它是赋值表达式一部分 var bar = function foo(){}; // 表达式,因为它是new...表达式 new function bar(){}; (function(){ // 声明,因为它是函数体一部分 function bar(){} })(); 还有一种函数表达式不太常见,就是括号括住...,括号会被解释为上一行代码最末函数调用,产生完全不符合预期,并且难以调试行为,加号等运算符也有类似的问题。...所以一些推荐不加分号代码风格规范,会要求在括号前面加上分号

70520

写给前端专家一封公开信:关于分号(翻译)

Inimino 文章《JS 分号必知必会》对此解释得很清楚,他本人对是否添加分号持保留意见,但我打算更主观一些。...第四条是我们恐惧诱因:「不行,你一定要加上分号,不然下一行二元操作符会引发问题!」但是,如果下一行不想影响上一行,只要在行首加一个分号就能解决问题。...比如 foo(); [1,2,3].forEach(bar); 可以写成 foo() ;[1,2,3].forEach(bar) 这样写好处是行首分号更容易引起注意,而且你会习惯于在以 ( 和 [ 开头语句前面加上分号...// 预期 return 7 // 产生错误 return 7 我必须再一次强调,在你改变了「在一切语句后面加分号习惯后,这种问题是非常容易发现和避免。...所以不要再拿 return 例子来说自动加分号坏话了,如果你不了解 ASI 的话你就承认自己在滥用分号就好了。

50310

写给前端专家一封公开信:关于分号(翻译)

Inimino 文章《JS 分号必知必会》对此解释得很清楚,他本人对是否添加分号持保留意见,但我打算更主观一些。...第四条是我们恐惧诱因:「不行,你一定要加上分号,不然下一行二元操作符会引发问题!」但是,如果下一行不想影响上一行,只要在行首加一个分号就能解决问题。...比如 foo(); [1,2,3].forEach(bar); 可以写成 foo() ;[1,2,3].forEach(bar) 这样写好处是行首分号更容易引起注意,而且你会习惯于在以 ( 和 [ 开头语句前面加上分号...// 预期 return 7 // 产生错误 return 7 我必须再一次强调,在你改变了「在一切语句后面加分号习惯后,这种问题是非常容易发现和避免。...所以不要再拿 return 例子来说自动加分号坏话了,如果你不了解 ASI 的话你就承认自己在滥用分号就好了。

75270

JavaScript代码规范

不推荐 var foo = 1,bar = 2 var foo = 1 , bar = 2 var foo = 1 ,bar = 2 推荐 var foo = 1, bar = 2 逗号风格 逗号分隔列表时...var foo = 1 , bar = 2 var foo = ['name' , 'age'] 推荐 var foo = 1, bar = 2 var foo = [...团队约定在声明变量时,一个声明只能有一个变量 不推荐 var a, b, c 推荐 var a var b var c 分号 JavaScript 在所有类 C 语言中是比较独特,它不需要在每个语句末尾有分号...在很多情况下,JavaScript 引擎可以确定一个分号应该在什么位置然后自动添加它。此特征被称为 自动分号插入 (ASI),认为是 JavaScript 中较为有争议特征。...团队中对于是否应该使用分号,也有许多争论,本规范推荐不使用分号,因为我们认为好工程师应该知道什么时候该加,什么时候不该加。 相关参考 :semi 代码块空格 一致性是任何风格指南重要组成部分。

2.6K30

C语言编程规范 clean code

(b) : (a)) #ifdef SOME_DEFINE void Bar(int); #define Foo(a) Bar(a) // 特殊场景,用大驼峰风格命名函数式宏 #else void...逗号、分号、冒号(不含三目操作符和表示位域冒号)紧跟前面内容无空格,其后需要空格 函数参数列表小括号与函数名之间无空格 类型强制转换小括号与转换对象之间无空格 数组中括号与数组名之间无空格...void Bar(void); // Good: 对内函数声明放在.c文件头部,并声明为static限制其作用域 void Foo(void) { Bar(); } static void...不符合规范案例: a.c 内容 extern int Foo(void); // Bad: 通过 extern 方式引用外部函数 void Bar(void) { int i = Foo...但在 b.h 中,由于 #include "a.h" 放到了 extern "C" 内部,函数 Foo 链接规范不正确地更改了。

5.3K10

C语言编程规范 clean code

(b) : (a)) #ifdef SOME_DEFINE void Bar(int); #define Foo(a) Bar(a) // 特殊场景,用大驼峰风格命名函数式宏 #else void...逗号、分号、冒号(不含三目操作符和表示位域冒号)紧跟前面内容无空格,其后需要空格 函数参数列表小括号与函数名之间无空格 类型强制转换小括号与转换对象之间无空格 数组中括号与数组名之间无空格...void Bar(void); // Good: 对内函数声明放在.c文件头部,并声明为static限制其作用域 void Foo(void) { Bar(); } static void...不符合规范案例: a.c 内容 extern int Foo(void); // Bad: 通过 extern 方式引用外部函数 void Bar(void) { int i = Foo...但在 b.h 中,由于 #include "a.h" 放到了 extern "C" 内部,函数 Foo 链接规范不正确地更改了。

4.2K10

JavaScript 模式》读书笔记(4)— 函数1

函数声明中并不需要分号结尾,但在函数表达式中需要分号,并且应该总是使用分号,及时编辑其中分号自动插入机制可能帮您完成了这个工作。...var foo = function bar() {}; console.log(foo.name)   这样做也是可以,打印出得结果是bar。...();   在这个例子中我们可以看到,如同正常变量一样,仅存在与hoistMe()函数中foobar移动到了顶部,从而覆盖了全局foobar函数。...两者之间区别在于局部foo()定义提升到顶部且能正常运行,即使在后面才定义它。bar()定义并没有提升,仅有他声明提升。...这就是为什么代码执行到达bar()定义时,其显示结果是undefined且并没有作为函数来调用(然而,在作用域链中,仍然防止全局bar()“看到”)。

37610

《JavaScript 模式》读书笔记(4)— 函数1

函数声明中并不需要分号结尾,但在函数表达式中需要分号,并且应该总是使用分号,及时编辑其中分号自动插入机制可能帮您完成了这个工作。...var foo = function bar() {}; console.log(foo.name)   这样做也是可以,打印出得结果是bar。...();   在这个例子中我们可以看到,如同正常变量一样,仅存在与hoistMe()函数中foobar移动到了顶部,从而覆盖了全局foobar函数。...两者之间区别在于局部foo()定义提升到顶部且能正常运行,即使在后面才定义它。bar()定义并没有提升,仅有他声明提升。...这就是为什么代码执行到达bar()定义时,其显示结果是undefined且并没有作为函数来调用(然而,在作用域链中,仍然防止全局bar()“看到”)。

21510

Google Python 编码规范指南(建议收藏)

分号 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 每行不超过80个字符 例外: 长导入模块语句 注释里URL 不要使用反斜杠连接行....描述应该包括所需类型和含义. 如果一个函数接受*foo(可变长度参数列表)或者**bar (任意关键字参数), 应该详细列出*foo和**bar....延时垃圾处理机制可能会导致对象生命周期任意无限制延长. 对于文件意外引用,会导致对于文件持有时间超出预期(比如对于异常跟踪, 包含有全局变量等)....bar from foo.bar import baz from foo.bar import Quux from Foob import ar 语句 通常每个语句应该独占一行 不过, 如果测试结果与测试语句在一行放得下...Yes: if foo: bar(foo) No: if foo: bar(foo) else: baz(foo) try: bar(foo)

4.1K41

javascript入门到进阶 - javascript词法文法

ECMAScript源码文本会被从左到右扫描,并转换为一系列输入元素,包括tokens、控制符、行终止符、注释和空白符。ECMAScript定义了一些关键字、字面量以及行尾分号补全规则。 ?...var o = { a: "foo", b: "bar", c: 42 }; // ES6中简略表示方法 var a = "foo", b = "bar", c = 42; var o = {a,...[1954, 1974, 1990, 2014] 「字符串直接量」 'foo' "bar" 十六进制转义序列 '\xA9' // "©" Unicode转义序列 Unicode转义序列要求在\u之后至少有四个字符...使用Unicode编码转义,任何字符都可以转义为十六进制编码。最高可以用到0x10FFFF。使用单纯Unicode转义通常需要写成分开两半以达到相同效果。.../ab+c/g // 一个空正则表达式直接量 // 必须有一个空非捕获分组 // 以避免当成是行注释符号 /(?:)/ 「模板直接量」更多信息可以参考template strings。

73720

Google 出品 Python 编码规范,强烈推荐!

分号 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 每行不超过80个字符 例外: 长导入模块语句 注释里URL 不要使用反斜杠连接行....描述应该包括所需类型和含义. 如果一个函数接受*foo(可变长度参数列表)或者**bar (任意关键字参数), 应该详细列出*foo和**bar....延时垃圾处理机制可能会导致对象生命周期任意无限制延长. 对于文件意外引用,会导致对于文件持有时间超出预期(比如对于异常跟踪, 包含有全局变量等)....bar from foo.bar import baz from foo.bar import Quux from Foob import ar 语句 通常每个语句应该独占一行 不过, 如果测试结果与测试语句在一行放得下...Yes: if foo: bar(foo) No: if foo: bar(foo) else: baz(foo) try: bar(foo)

33410

前端必备,25个最基本JavaScript面试问题及答案

尽管 typeof bar === "object" 是检查 bar 是否对象可靠方法,令人惊讶是在JavaScript中 null 也认为是对象!...(); 上面的代码将输出以下内容到控制台: outer func: this.foo = bar outer func: self.foo = bar inner func: this.foo =...function foo1() { return { bar: "hello" }; } function foo2() { return { bar: "hello" }; } 出人意料是,这两个函数返回内容并不相同...原因与这样一个事实有关,即分号在JavaScript中是一个可选项(尽管省略它们通常是非常糟糕形式)。...其结果就是,当碰到 foo2()中包含 return语句代码行(代码行上没有其他任何代码),分号会立即自动插入到返回语句之后。

91430
领券