JavaScript执行上下文与执行栈深度解析

需积分: 0 0 下载量 157 浏览量 更新于2024-08-04 收藏 174KB DOCX 举报
"前端大厂最新面试题-context_stack.docx" 在JavaScript中,执行上下文(Execution Context)和执行栈(Execution Stack)是理解代码执行流程的关键概念,尤其对于前端工程师来说,掌握这些知识至关重要。 一、执行上下文 执行上下文是JavaScript引擎在运行代码前创建的一个抽象环境,它定义了变量、函数、this等如何被解析和处理。主要有三种类型的执行上下文: 1. 全局执行上下文:这是最外层的上下文,在浏览器环境中,全局对象通常是`window`,所有不在任何函数内的代码都在这个上下文中执行,`this`在这里默认指向`window`。 2. 函数执行上下文:每当函数被调用时,一个新的执行上下文就会被创建。每个函数调用都有自己的独立上下文,形成一个私有作用域,函数内部声明的变量仅在其内部可见。 3. Eval函数执行上下文:在`eval()`函数内部执行的代码会有自己的执行上下文,但由于安全和性能问题,不推荐使用`eval()`。 二、执行上下文的生命周期 执行上下文的生命周期分为三个阶段: 1. 创建阶段:在这个阶段,JavaScript引擎会创建执行上下文,并确定`this`的值、词法环境(Lexical Environment)和变量环境(Variable Environment)。 - `ThisBinding`:`this`的值在这个阶段被确定,根据调用方式(方法调用、构造器调用、上下文对象调用等)会有不同。 - 词法环境:包括全局环境和函数环境。全局环境没有外部环境引用,包含全局对象;函数环境则保存函数内部的变量和`arguments`对象,外部环境引用可能是全局环境或外部函数的环境。 2. 执行阶段:在创建阶段后,代码开始实际执行,变量和函数被调用。 3. 回收阶段:执行完成后,不再需要的资源会被垃圾回收机制清理。 三、执行栈 执行栈是JavaScript引擎管理代码执行的一个数据结构,它遵循“后进先出”(LIFO)原则。当函数被调用时,新的执行上下文会被推入栈顶,代码在新上下文中执行。一旦函数执行完毕,对应的执行上下文会被弹出栈,返回到上一级上下文继续执行。这就是所谓的调用堆栈(Call Stack)原理,用于管理函数的递归调用和同步代码的执行顺序。 总结来说,理解和掌握执行上下文及执行栈对于解决JavaScript中的作用域、闭包、异步操作等问题至关重要,是前端工程师面试中常见的考察点。熟悉这些概念能够帮助开发者编写更加高效、可维护的代码。

这是上题的代码:def infix_to_postfix(expression): precedence = {'!': 3, '&': 2, '|': 1, '(': 0} op_stack = [] postfix_list = [] token_list = expression.split() for token in token_list: if token.isalnum(): postfix_list.append(token) elif token == '(': op_stack.append(token) elif token == ')': top_token = op_stack.pop() while top_token != '(': postfix_list.append(top_token) top_token = op_stack.pop() else: # operator while op_stack and precedence[op_stack[-1]] >= precedence[token]: postfix_list.append(op_stack.pop()) op_stack.append(token) while op_stack: postfix_list.append(op_stack.pop()) return ' '.join(postfix_list) class Node: def __init__(self, value): self.value = value self.left_child = None self.right_child = None def build_expression_tree(postfix_expr): operator_stack = [] token_list = postfix_expr.split() for token in token_list: if token.isalnum(): node = Node(token) operator_stack.append(node) else: right_node = operator_stack.pop() left_node = operator_stack.pop() node = Node(token) node.left_child = left_node node.right_child = right_node operator_stack.append(node) return operator_stack.pop() def evaluate_expression_tree(node, variable_values): if node.value.isalnum(): return variable_values[node.value] else: left_value = evaluate_expression_tree(node.left_child, variable_values) right_value = evaluate_expression_tree(node.right_child, variable_values) if node.value == '!': return not left_value elif node.value == '&': return left_value and right_value elif node.value == '|': return left_value or right_value expression = "!a & (b | c)" postfix_expression = infix_to_postfix(expression) expression_tree = build_expression_tree(postfix_expression) variable_values = {'a': True, 'b': False, 'c': True} result = evaluate_expression_tree(expression_tree, variable_values) print(result)

2023-06-12 上传

下面是我 运行终端代码后的返回,请帮我解释下:shenhaibo@bogon webAssembly % emcc add.c -s WASM=1 -o add.wasm wasm-ld: error: /opt/homebrew/Cellar/emscripten/3.1.40/libexec/cache/sysroot/lib/wasm32-emscripten/libstandalonewasm-nocatch.a(__main_void.o): undefined symbol: main emcc: error: '/opt/homebrew/Cellar/emscripten/3.1.40/libexec/llvm/bin/wasm-ld -o add.wasm /var/folders/hd/zkctfvz128366gcjfw9pgslr0000gn/T/emscripten_temp_0gmz58hs/add_0.o -L/opt/homebrew/Cellar/emscripten/3.1.40/libexec/cache/sysroot/lib/wasm32-emscripten /opt/homebrew/Cellar/emscripten/3.1.40/libexec/cache/sysroot/lib/wasm32-emscripten/crt1.o -lGL -lal -lhtml5 -lstandalonewasm-nocatch -lstubs-debug -lc-debug -ldlmalloc -lcompiler_rt -lc++-noexcept -lc++abi-debug-noexcept -lsockets -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr /var/folders/hd/zkctfvz128366gcjfw9pgslr0000gn/T/tmp6m8wb6r0libemscripten_js_symbols.so --strip-debug --export-if-defined=__start_em_asm --export-if-defined=__stop_em_asm --export-if-defined=__start_em_lib_deps --export-if-defined=__stop_em_lib_deps --export-if-defined=__start_em_js --export-if-defined=__stop_em_js --export=emscripten_stack_get_end --export=emscripten_stack_get_free --export=emscripten_stack_get_base --export=emscripten_stack_get_current --export=emscripten_stack_init --export=stackSave --export=stackRestore --export=stackAlloc --export=__errno_location --export-table -z stack-size=65536 --initial-memory=16777216 --max-memory=16777216 --stack-first' failed (returned 1) shenhaibo@bogon webAssembly %

2023-06-07 上传