変数宣言
変数宣言の方法
VaRのJSの誕生を伴います
// 语法 var varName = value
var a = 1 // 这样子你就得到了一个变量
VAR欠陥シーン解析
var specialUser = "cj"; // 在A文件定义
var specialUser = "fk"; // A文件很大,你没去寻找是否定义此变量,直接定义
getImportantInformation(specialUser); // 在B文件定义
我々は通常、変数を定義し、この変数が定義されているかどうかを確認スキップ特にローカルコードの準備で、それがさらにある重複した名前の定義につながる可能性の高いシステムに重大な損傷を引き起こす、変数がカバーされているコアの一部で、その結果、原因で、すべての異常行動変数にspcialUser変数は、人々がいるので、上記の例では、システムで使用するようになります。この変数の定義であれば、コンパイラは知ることができ、怠惰になることを学ぶ必要があり、なぜ私たちは、変数を定義するために、プログラマの前に行くべきでなく、プロジェクトにそれは、場合、この変数は、ファイルの下で定義された検索コードがコンパイルされますが、この変数が定義されている場合は、直接の競合は、我々がうまく置き換えるために必要なことを教えてくれる。
多くの問題のためのJS仕様の誕生を聞かせて
実際には、コア変数からカバーが、私は、ビジネスで出会ったプログラムの数は、この種のものに遭遇したAPE推定された、その後のECMAScript公式が出てきた、すべてのJS言語インタプリタは、変数宣言の新しい方法を実装する必要があります私たちはカバー変数を心配するより少ない時間を過ごすのに役立ちます。
let name = "cj"; // 无论在何处定义
let name = "cj"; // 如果此变量在此作用域找了let name 这样的,编译器就会说,你这个名字用过了,要换个名字。
変数は、同じ名前の変数とスコープを定義されている場合、インタプリタはあなたと同じ名前の他の人が、あなたが名前を変更する必要があり、それを教えてくれます、あなたは、変数の定義ことを安心することができ、これは我々がカバーされている元の変数を心配する必要はありません聞かせてい非常に快適。
それ以上に、VAR異常行動
私たちは、変数を学ぶとき、教師は最初の変数、その後のアクセスを定義し、言う、我々は敗北を認め、その後の定義にアクセスしようとします
console.log(name) // 咦? 为什么不会报错
var name = "cj"
ああ?はい、先生とのこの時間は矛盾がある教えJS、先生は間違っていたが、カウンター-jsから常識的なものなので、それを設計した理由、ここでは知られていないが、しかし、コスト変数の使用を増加させ、そしてなぜ私が言うのですか
code 1
code 2 //
var name = 1 // code 2 定义的变量,
ある日、私たちは、これが適切にCODE1名にアクセスできるようにすることです、よく、あなたはそれを推測、これは前CODE1で定義された変数を検索するかもしれないかどうか、CODE1にこの変数を参照したいと思い、私たちは私たちを助けるために、コンパイラツールを聞かせすることができます私たちは、変数を定義する前に、変数にアクセスする場合、この問題に対処するため、コンパイラは、ここで私達を知らせアクセスすることはできません
console.log(name)
let name = "cj"
看到这熟悉的提示,喔,原来我们在定义变量之前访问了变量,这时候我们就修改一下代码调用顺序,其实,这种机制也保证了代码的显式调用顺序的健壮
console.log(name) // 嗯? 不行?
let name = "cj"
console.log(name) // 这样才对
let name = "cj"
不受控制的var
由于程序少则几百行,我们公司大就几十万行,这就出现了人的名字的管理问题,如何解决重名问题呢,在此基础上拓展新的标识是一个不错的方法,比如中国很多重名的,地址就是一个额外标记的好东西,我们程序也在内存里分块,但是这不是重点,在内存上一层的抽象,语言有一个叫做作用域的东西,相当于把程序分成不同的城市,一般来说变量被限制在这些块里,通过这种方式,我们很多通用的变量名得以大量使用而不冲突,因为它们不属于一个块,想象一下,如果中国只有一个城市,那么同名的人就可能得叫支付宝-1 支付宝-2了,变量在这种情况下也是一样,需要大量前缀,所以作用域的作用可想而知,当然作用域的设计来源复杂多,嘻嘻,以后有空研究下,
if(condition) {
var a = 11;
}
var a = 33 // 此时我想在if外面的作用域定义了一个变量,却以不小心覆盖了if内部的变量a,导致程序异常
上述代码还有致命问题,一般来说,我们在不同作用域定义变量是互不影响的,但是上面的代码却违反了这个规则,倒置变量可能的异常,上述代码在同步场景下,基本没什么影响,在异步场景就会因为后者定义覆盖的问题导致程序异常
if(true) {
var a = 3
setTimeout( () => {
console.log(a) // 5而不是3
}, 0)
}
var a = 5
let 就使得js拥有了真正的块作用域
if(true) {
let a = 3
setTimeout( () => {
console.log(a) // 3
}, 0)
}
let a = 5
let遗漏的场景
let PI = 3.14
PI = 3.14132
有时候我们需要定义一个变量,在很多地方使用,但是由于这个变量很重要,所以后续有对它的修改,都是会对程序造成破坏,我们不希望,但是,当我们对一个变量赋值时,怎么知道其是不能修改的呢,嗯,只能阅读源码,确定其重要性,这样费事费力,能让我们的工具人编译器帮助我们吗,是的,它做到了
const PI = 3.14
PI = 3.14132
我々はいくつかの値を変更したい場合は場合、著者はのconstとしてマークした後、私たちは私たちに教えてくれるコンパイラを変更し、変数を使用して変更することができない、ちょっと、弟は、この変数システムは本当に素晴らしい、ハングアップします移動しました。
概要
新しい構文環境では、我々はあなたが定義するためのconstを使用することができ、変数を変更する必要がない場合は、これに基づいて変数を定義するために聞かせて、できるだけ多くを使用する 1もコンパイラを向上させることができ、他の人の変更を避けるために、一方で、効率。