lexically scoped 词法作用域
参考:https://www.bbsmax.com/A/qVdeaD1bdP/
JavaScript第一点与C不同的是变量的作用范围。我们都知道,C风格的编程语言中,变量的作用范围是两个大括号之间,变量在两个大括号之外是不可见的,我们称之为Block Scope。
而JavaScript则不然 - 变量在真个函数内以及此函数的内嵌函数中均可见,我们称之为Function Scope。比如:
function test(o){
var i = 0;
if (typeof o == "object"){
var j = 0;
for (var k = 0; k < 10; k++){
console.log(k);
}
console.log(k); // k = 10, k虽然在for循环中定义,可是在for循环之外的整个函数体依然可见。
}
console.log(j); // j =0 或者j = undefined,j虽然在if块中声明并定义,可是它在整个函数体中依然可见。
}
- Hoisting
JavaScript变量的另外一个奇特的地方还在于,在一个函数体内任何一个地方定义(defined)的变量,都被假定为其在函数的一开始处被定义(但是可能没有初始化)。也就是说,所有变量的定义都被"hoisted"(提升)到函数的开始处。比如下面这个例子:
var scope = "global";
function f(){
console.log(scope); // 输出"undefined",而不是"global",因为本地的scope变量已经生效,只是还没有初始化。
var scope = "local"; // 在此处初始化,但是其实已经在函数的开始处被声明了,因此上面的代码输出的是"undefined"
console.log(scope); //输出"local"
}
总而言之,JavaScript是一个Lexically Scoped Language,即JavaScript是基于词法作用域(lexically scoped)的,所以标识符被固定在它们被定义的作用域而不是语法上或是其被调用时的作用域。
大势
静态语言
优点:其结构非常规范,便于调试,方便类型安全
缺点:为此需要写更多的类型相关代码,导致不便于阅读、不清晰明了
在今天这个信息泛滥的时代,身为开发者,眼光比技术更重要。缺乏眼光的人,着眼于小,为细枝末节的所谓“创新”不惜肝脑涂地,赴汤蹈火,而面临真正变革时,或坐井观天,守旧拒新,或畏畏缩缩,裹足不前。具备眼光的人,着眼于大,平时稳扎稳打,不为世间纷扰所扰,一旦时机出现,则能抛却门户之见,枝节之争,以过人气概投身变革,成就自己的事业。这前后两者的差距之大,其实全在于对大趋势的把握上。
当关系数据库和SQL语言把数据管理的繁琐工作从开发者和操作者身上解放出来的时候,有人抨击关系数据库性能低下;当微软开始用C语言开发PC应用程序时,汇编语言的拥护者轻蔑的说,只有汇编语言才能发挥PC机的全部能力;当Web进军企业计算时,一大批专家跑出来抨击HTML界面的呆板和HTTP协议的缓慢和幼稚。然而,所有这一切抱怨、质疑和信誓旦旦的否定,都被技术发展的大潮无情的吞噬,消失得无影无踪。
原因很简单,所有这些声音,都是着眼于小,着眼于私,一叶障目,而不见IT技术发展的大势。IT技术发展的大趋势永远都是要更快,更简单。
———————————————
原文链接:https://blog.csdn.net/yueyueniaolzp/java/article/details/80363758
Null-aware operators
Null-aware operators in Dart help resolve this issue. They’re basically ways to say,
“If this object or value is null, then forget about it: just cut out here, but don’t throw
an error.”
Finally, Dart is sane, and a condition must evaluate to a Boolean
判断条件必须为布尔值