为什么javascript可以理解函数外和循环外的变量?
我认为我的问题与你的不一致 在另一种语言(C#)中,我看到一个变量声明 在函数或循环中,当您离开函数或循环时,它们无法访问已在其他函数中声明的变量,但在javascript中可以为什么javascript可以理解函数外和循环外的变量?,javascript,jquery,Javascript,Jquery,我认为我的问题与你的不一致 在另一种语言(C#)中,我看到一个变量声明 在函数或循环中,当您离开函数或循环时,它们无法访问已在其他函数中声明的变量,但在javascript中可以 $(document).ready(function () { Text(); Tex2(); }); function Text() { for (xxi = 0; xxi < 10; xxi++) { console.l
$(document).ready(function () {
Text();
Tex2();
});
function Text() {
for (xxi = 0; xxi < 10; xxi++) {
console.log(xxi);
iix = 99;
}
console.log(xxi + iix);
Tex2();
}
function Tex2() {
console.log("What the hel:" + (xxi + iix));
}
$(文档).ready(函数(){
Text();
Tex2();
});
函数文本(){
对于(xxi=0;xxi<10;xxi++){
控制台日志(xxi);
iix=99;
}
控制台日志(xxi+iix);
Tex2();
}
函数Tex2(){
console.log(“What the hel:”+(xxi+iix));
}
结果是:
有人能为我解释细节吗?谢谢。您需要声明变量,否则范围将与window.iix相同。下面的代码段具有您期望的结果(错误) 我已将(xxi=0;xxi<10;xxi++)的
行更改为(var xxi=0;xxi<10;xxi++){
$(文档).ready(函数(){
Text();
Tex2();
});
函数文本(){
对于(var xxi=0;xxi<10;xxi++){
控制台日志(xxi);
iix=99;
}
控制台日志(xxi+iix);
Tex2();
}
函数Tex2(){
console.log(“What the hel:”+(xxi+iix));
}
您需要声明变量,否则范围将与window.iix相同。下面的代码段具有您期望的结果(错误)
我已将(xxi=0;xxi<10;xxi++)的行更改为(var xxi=0;xxi<10;xxi++){
$(文档).ready(函数(){
Text();
Tex2();
});
函数文本(){
对于(var xxi=0;xxi<10;xxi++){
控制台日志(xxi);
iix=99;
}
控制台日志(xxi+iix);
Tex2();
}
函数Tex2(){
console.log(“What the hel:”+(xxi+iix));
}
您将它们声明为全局变量,而不使用var
关键字。使用var
关键字将它们限定在其预期范围内,或在javascript文件顶部使用“Use strict”
。您还可以使用let
关键字将它们限定在其非常局部的范围内
声明不使用的变量具有全局作用域
javascript将使用var关键字声明的变量视为其闭合范围或函数内的第一条语句。因此,它全局定义变量,或局部定义整个函数的变量,而不考虑块范围
let关键字允许声明范围限于其使用的块、语句或表达式的变量
我已经在下面创建了3个代码段。一个带有let
关键字,一个带有var
关键字,还有一个带有对代码使用严格的关键字。运行以查看同一代码段的行为变化
下面的片段
let
关键字代码段。运行以查看该变量在块范围之外不可用。
//let关键字片段。See变量在块范围之外不可用。
$(文档).ready(函数(){
Text();
Tex2();
});
函数文本(){
for(设xxi=0;xxi<10;xxi++){
控制台日志(xxi);
设iix=99;
}
var-xyz;
尝试
{
xyz=xxi+iix;
}
捕获(e){
xyz=e;
}
console.log(xyz);
Tex2();
}
函数Tex2(){
var-abc;
尝试
{
abc=(xxi+iix);
}
捕获(e){
abc=e;
}
日志(“什么是hel:+abc”);
}
您将它们声明为全局变量,而不使用var
关键字。使用var
关键字将它们限定在其预期范围内,或在javascript文件顶部使用“Use strict”
。您还可以使用let
关键字将它们限定在其非常局部的范围内
声明不使用的变量具有全局作用域
javascript将使用var关键字声明的变量视为其闭合范围或函数内的第一条语句。因此,它全局定义变量,或局部定义整个函数的变量,而不考虑块范围
let关键字允许声明范围限于其使用的块、语句或表达式的变量
我已经在下面创建了3个代码段。一个带有let
关键字,一个带有var
关键字,还有一个带有对代码使用严格的关键字。运行以查看同一代码段的行为变化
下面的片段
let
关键字代码段。运行以查看该变量在块范围之外不可用。
//let关键字片段。See变量在块范围之外不可用。
$(文档).ready(函数(){
Text();
Tex2();
});
函数文本(){
for(设xxi=0;xxi<10;xxi++){
控制台日志(xxi);
设iix=99;
}
var-xyz;
尝试
{
xyz=xxi+iix;
}
捕获(e){
xyz=e;
}
console.log(xyz);
Tex2();
}
函数Tex2(){
var-abc;
尝试
{
abc=(xxi+iix);
}
捕获(e){
abc=e;
}
日志(“什么是hel:+abc”);
}
当您不使用var
声明变量时,将其理解为全局变量。
如果您每次声明变量时都使用var
或让声明变量,则代码中发生的事情不会再次发生。当您不使用var
声明变量时,将其理解为全局变量。
如果使用var
或,代码中发生的事情将不会再次发生
for (xxi = 0; xxi < 10; xxi++) {
console.log(xxi); // this variable
iix = 99; // this variable
}
for (var xxi = 0; xxi < 10; xxi++) {
console.log(xxi);
var iix = 99;
}
var xxi = "one"; //global variable
var iix = "two"; //global variable
globalVar = "three"; // window variable i.e. window.globalVar
var getValues = function () {
var xxi; //local variable for the scope
var iix; //local variable for the scope
for (xxi = 0; xxi < 10; xxi++) {
console.log(xxi); // takes the local variable
iix = 99; //local change of value
}
globalVar = 100; //change of value to window variable accessible inside
};
getValues();
var seeValues = function () {
console.log(xxi); //"one" //Displays the value of global because the local variable of getValues() is not accessible outside
console.log(iix); //"two" //Same as above
console.log(globalVar); //100 and not "three" //Displays the altered window variable
};
seeValues();