如果函数是对象,函数体去哪里了?
让我澄清一下我的困惑。函数是对象,好吧。我可以将对象视为由字符串键和任意类型的值组成的哈希映射。我可以做这个:
function Square(size) {
Rectangle.call(this, size, size);
}
Square.prototype = new Rectangle();
Run Code Online (Sandbox Code Playgroud)
我只是把它Square当作一个普通对象对待,并prototype通过为它分配一个新值来弄乱它的属性。但是,如果函数只是对象(或与此相关的哈希映射),那么函数的主体(在此示例中Rectangle.call(this, size, size);)存储在哪里?
我认为它必须存储为某些属性的值,可能如下所示:
console.log(Square.executableBody); // "Rectangle.call(this, size, size);"
Run Code Online (Sandbox Code Playgroud)
显然,情况并非如此。有趣的是,在阅读 Nicholas C. Zakas 的“面向对象的 JavaScript 原理”时,我偶然发现了这一点:
[...] 函数实际上是 JavaScript 中的对象。函数的定义特征——它与任何其他对象的区别——是存在一个名为 [[Call]] 的内部属性。内部属性无法通过代码访问 [...] [[Call]] 属性是函数独有的,表示可以执行对象。
这可能是我在上面寻找的属性。不过,它没有详细说明。函数的主体是否实际存储在[[Call]]属性中?如果是这样,执行如何工作?不幸的是我无法找到更多关于[[Call]],谷歌主要想出了关于函数call方法的信息......
一些澄清将不胜感激!:)
正如标题所暗示的那样,我无法看到我大学网络课程中不断提到的以下概念之间的区别:
我觉得各个术语都在不断地使用相同的类比来解释。由于我无法在网上找到明确的答案,我认为在这里提及这一点可能是个好主意。
谢谢!
我目前正在尝试理解汇编语言中宏的概念.我大学的幻灯片说明如下:
# How to define a macro:
.macro write string
movl string, %esi
call printstr
.endm
# How to use a macro:
write aString
Run Code Online (Sandbox Code Playgroud)
但是,这对我不起作用.我正在使用gcc编译我的代码.
.data
msg: .string "The result is %d.\n"
.text
.global main
.macro add_3 n
movl n, %eax
addl $3, %eax
.endm
main:
add_3 $39
pushl %eax
pushl $msg
call printf
popl %eax
popl %eax
movl $1, %eax
int $0x80
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,我收到以下错误:
undefined reference to `n'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我沿用了《Example》中的C ++ 17一书,该书通过展示一系列迷你项目介绍了C ++ 17,这很酷。
但是,在第2章中,在a Set之上实现a的LinkedList是以下代码:
void Set::read(std::istream& inStream) {
int size;
inStream >> size;
int count = 0;
while (count < size) {
double value;
inStream >> value;
insert(value);
++count;
}
}
Run Code Online (Sandbox Code Playgroud)
void Set::write(std::ostream& outStream) {
outStream << "{";
bool firstValue = true;
Iterator iterator = first();
while (iterator.hasNext()) {
outStream << (firstValue ? "" : ", ") << iterator.getValue();
firstValue = false;
iterator.next();
}
outStream << "}";
}
Run Code Online (Sandbox Code Playgroud)
int main() …Run Code Online (Sandbox Code Playgroud) 我提前道歉,之前可能已经在StackOverflow上讨论了,我只是不知道这叫什么,所以我找不到满意的答案.
但是,我正在学习JavaScript和一本名为"Eloquent JavaScript"的书.在那里,我找到了以下代码,它反复提示用户输入他的名字,直到他这样做.
while (!input) {
var input = prompt("Who are you?");
}
Run Code Online (Sandbox Code Playgroud)
我根本不明白为什么这实际上有效而不是引发错误.在评估条件表达式时,没有称为输入的变量.如果我理解正确,则无法进行评估,这通常会阻止进一步执行.在while循环体,它的声明,然后创建一个名为变量输入,仍在执行,但.
然而,这让我很焦虑,所以我尝试了这个:
while (!bool) {
console.log("Hi");
var bool = true;
}
Run Code Online (Sandbox Code Playgroud)
这甚至更奇怪.当涉及条件表达式时,它也是同样的问题:在评估条件之后,在循环体的范围内创建bool.其次,bool经常设置为true,但代码仍然执行一次,换句话说,Hi正在打印一次.
我很困惑,希望得到一些帮助.;)