JavaScript / Python匿名函数vs命名函数作用域

时间:2014-02-01 04:46:47

标签: javascript python function scope

我正在使用Python和JavaScript中的函数进行范围继承试验,我想完全理解它为什么会运行它。注意:我在最新版本的node和python3中运行了以下示例。

问题1:为什么函数表达式在B情况下能够改变全局函数f()但是情况A不能?

问题2:在python中,我们可以实现案例A,如下所示。有没有办法在Python中实现案例B并让它返回1?

JavaScript函数定义(案例A):

function f() {
    return 0
}

function g() {
    console.log(f())
}

function h() {
    function f() {
        return 1
    }
    g()
}

h() // returns 0
console.log(f()) // returns 0

JavaScript函数表达式(案例B):

function f() {
    return 0
}

function g() {
    console.log(f())
}

function h() {
    f = function () {
        return 1
    };
    g()
}

h() // returns 1
console.log(f()) // returns 1

Python函数定义(案例A):

def f():
    return 0


def g():
    print(f())


def h():
    def f():
        return 1
    g()

h() # return 0

2 个答案:

答案 0 :(得分:2)

当你省略var时,你会创建一个隐含的全局;由于已经定义了全局f,因此您应该覆盖它,这应该类似于案例A:

function h() {
    var f = function () {
        return 1
    };
    g()
}

函数表达式和函数声明之间的区别在于函数如何被提升但它们仅在函数的范围内可见,而不是全局。见var functionName = function() {} vs function functionName() {}

答案 1 :(得分:1)

正如elclanrs所说,差异源于这样一个事实:在JavaScript中,变量默认是全局的,而在Python中,默认情况下它们是本地的。要回答问题的第二部分,您可以通过在f内明确标记h为全局来在Python中实现相同的效果:

def f():
    return 0


def g():
    print(f())


def h():
    global f
    def f():
        return 1
    g()

>>> h()
1

为什么你想这样做是个谜。