gpt4 book ai didi

javascript - 书中关于动态调度——[Programming JavaScript Applications]

转载 作者:行者123 更新时间:2023-12-01 03:20:27 25 4
gpt4 key购买 nike

我遇到了一个关于动态调度的问题。以下是《JavaScript应用程序编程》一书中的代码片段,我把它放在https://jsfiddle.net/abramhum/bbfxxwok/1/

function equals(a, b, c) {
console.log("a[=]" + a);
if (a == b) {
console.log(c);
}
}

function test(a, fn) {
console.log(a + " ---start function[=]");
fn.apply(this);
console.log(a + " ---Fnished");
}

var methods = {
init: function(args) {
return 'initializing...';
},
hello: function(args) {
return 'Hello, ' + args;
},
goodbye: function(args) {
return 'Goodbye, cruel ' + args;
}
},
greet = function greet(options) {
var args = [].slice.call(arguments, 0),
initialized = false,
action = 'init'; // init will run by default

if (typeof options === 'string' &&
typeof methods[options] === 'function') {
action = options;
args.shift();
}
return methods[action](args);
};

test('Dynamic dispatch', function() {
var test1 = greet(),
test2 = greet('hello', 'world!'),
test3 = greet('goodbye', 'world!');
equals(test2, 'Hello, world!',
'Dispatched to hello method.');
equals(test3, 'Goodbye, cruel world!',
'Dispatched to goodbye method.');
});

这个问题存在两个问题,一个是greet("goodbye", "world")什么时候执行,为什么调用greet(options),而options的值确实是第一个参数,比如"goodbye",“世界”可以通过参数得到;第二个是var methods ={...} ,它像 init 一样获取参数,如果匹配声明则返回值,如 init:function(args){...} ,但它确实不是 switch 的代码风格,以及为什么我们可以在 javascript 中使用它。这和C代码很不一样,我不知道为什么,有人知道原因吗?谢谢。

最佳答案

one is when greet("goodbye", "world") is executed, why it called greet(options), and the value about options is indeed the fist parameter, like "goodbye", and the "world" can be get via arguments

因为在 JavaScript 非箭头函数中,arguments是一个预定义的标识符,引用传递给函数的所有参数的伪数组。它与动态调度无关。这只是 JavaScript 函数的一个功能,在 JavaScript 获得正确的变量参数列表之前就很有用:

function foo() {
console.log("foo called, total arguments: " + arguments.length);
for (var n = 0; n < arguments.length; ++n) {
console.log("Arg #" + n + ":", arguments[n]);
}
}
foo();
foo("bar");
foo("biz", 42);

the second problem is var methods ={...}, it get the arguments like init

这些不是参数,而是为分配给方法的对象定义的属性。就像这里的 abc 一样:

var obj = {
a: 42,
b: "Whatever",
c: "just cuz"
};

...and return the value if matching the declare, like init:function(args){...}, but it indeed not code style of switch, and why we can use that in javascript.

因为函数是对象,所以像任何其他对象一样,您可以从变量、参数和对象属性中引用它们。 methods 的属性 inithellogoodbye 引用函数。您可以通过属性调用它们:method.init()

假设我们有变量name,其中包含“init”。我们可以在 methods 上查找具有该名称的属性:methods[name]。由于这为我们提供了对函数的引用,因此我们可以调用该函数。

var methods = {
init: function() {
console.log("init called");
}
};
var name = "init";
methods[name](); // "init called"

更多:Dynamically access object property using variable

This is much unlike C codes, I don't know why, is any one know the reason?

因为 C 和 JavaScript 是根本不同的语言,它们是在不同的时间、由不同的人、在不同的优先级和限制下、在不同的设计约束下创建的。

关于javascript - 书中关于动态调度——[Programming JavaScript Applications],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45253442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com