Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
两个javascript函数行为背后的逻辑_Javascript - Fatal编程技术网

两个javascript函数行为背后的逻辑

两个javascript函数行为背后的逻辑,javascript,Javascript,请解释这两种行为背后的逻辑,以便于理解 var a = 10; function foo(){ a = 20; } foo(); console.log(a); 打印--->a=20 var a = 10; function foo(a){ a = 20; } foo(); console.log(a); 打印--->a=10 因为范围 在Javascript中,当您在函数中指定参数时,您可以在该函数的作用域中定义该参数,而不管外部/全局作用域中是否已经存在名称为的变

请解释这两种行为背后的逻辑,以便于理解

var a = 10;
function foo(){
    a = 20;
}
foo();
console.log(a);
打印--->a=20

var a = 10;
function foo(a){
        a = 20;
}
foo();
console.log(a);
打印--->a=10

因为范围

在Javascript中,当您在函数中指定参数时,您可以在该函数的作用域中定义该参数,而不管外部/全局作用域中是否已经存在名称为的变量

更新:

值得一提的是,使用ES6的arrow函数,如果您的函数是在父类或函数中定义的,那么您仍然可以使用this关键字访问外部变量

范例

class Bar {

    this.a = 10;

    this.foo = function(a) {
        this.a = 20;    
    };

    this.foo2 = (a) => {
        this.a = 20;
    };

}
不完全相同,但它是关于范围的,因为范围

在Javascript中,当您在函数中指定参数时,您可以在该函数的作用域中定义该参数,而不管外部/全局作用域中是否已经存在名称为的变量

更新:

值得一提的是,使用ES6的arrow函数,如果您的函数是在父类或函数中定义的,那么您仍然可以使用this关键字访问外部变量

范例

class Bar {

    this.a = 10;

    this.foo = function(a) {
        this.a = 20;    
    };

    this.foo2 = (a) => {
        this.a = 20;
    };

}

不完全相同,但它是关于作用域的。在javascript中,如果使用var、let、const或使用函数中形式参数中提供的变量,函数变量有自己的作用域。如果不使用上述任何变量,则变量的作用域将是全局的

在javascript中,如果您使用var、let、const或使用函数中形式参数中提供的变量,函数变量有自己的作用域。如果不使用上述任何变量,则变量的作用域将是全局的

在第一个示例中,函数中的
a
正在替换函数外部的
a
的第一个声明,因为您没有使用
var
(或
let
const
)对其进行局部范围限定

在第二个示例中,函数接受
a
作为参数,因此它在函数的局部范围内。请注意,即使
a
未实际传递到函数中(因此
未定义
),也会发生这种情况


这可能会对您有所帮助。

在第一个示例中,函数中的
a
将替换函数外部的
a
的第一个声明,因为您没有使用
var
(或
let
const
)对其进行局部范围限定

在第二个示例中,函数接受
a
作为参数,因此它在函数的局部范围内。请注意,即使
a
未实际传递到函数中(因此
未定义
),也会发生这种情况


这可能会对您有所帮助。

请检查以下代码片段

var a=10;
var b=a;
函数foo(a){
//a此处指的是参数a,而不是全局变量,因为它被重写了
控制台日志(a,b);
a=20;
}
foo();
//打印全局变量a
控制台日志(a);
功能条(){
控制台日志(a,b);
//重写全局变量a
a=20;
}
bar();
//打印全局变量a

控制台日志(a)检查以下代码段

var a=10;
var b=a;
函数foo(a){
//a此处指的是参数a,而不是全局变量,因为它被重写了
控制台日志(a,b);
a=20;
}
foo();
//打印全局变量a
控制台日志(a);
功能条(){
控制台日志(a,b);
//重写全局变量a
a=20;
}
bar();
//打印全局变量a

控制台日志(a)第一个是因为全局范围

var a=10;
函数foo(){
a=20;
}

在这里,varieble a是全局访问的,并从函数内部更新全局varieble可以访问每个位置

在第二个示例中,仅将varieble a的引用作为参数传递,并且在函数内部接收的参数值发生更改

var a =10;
function foo(a){
 a= 20;
 console.log(a)
}
foo();
console.log(a);

请在console中运行代码的第二个示例,这样您就可以理解更改。

第一个示例是因为全局范围

var a=10;
函数foo(){
a=20;
}

在这里,varieble a是全局访问的,并从函数内部更新全局varieble可以访问每个位置

在第二个示例中,仅将varieble a的引用作为参数传递,并且在函数内部接收的参数值发生更改

var a =10;
function foo(a){
 a= 20;
 console.log(a)
}
foo();
console.log(a);

请在console中运行第二个代码示例,这样您就可以理解更改。

Scopes。函数foo首先检查其作用域中是否定义了“a”,如果未定义,则检查外部作用域..,依此类推。函数foo首先检查其作用域中是否定义了“a”,如果未定义,则检查外部作用域..以此类推