Javascript对象奇怪的行为

时间:2015-07-19 12:10:38

标签: javascript html

我执行了这个javascript代码:

var motorbike = {
    "Wheel" : move(),
    "Motor" : start()
}; // CREATE MOTORBIKE OBJECT

document.write(motorbike.Wheel); // MOVE MY MOTORBIKE
document.write(motorbike.Motor); // START MY MOTORBIKE

function move(){
    return "-I'm moving<br/>";
}

function start(){
    document.write("-Starting<br/>");
   return "-Broom broom...";
}

在屏幕上应该出现:

-I'm moving
-Starting
-Broom broom...

但是当我执行它时......

-Starting
-I'm moving
-Broom broom...

Javascript首先打印&#34;直接&#34; document.write(直接写入字符串的那个)然后打印使用return的那些。为什么javascript会这样做?

4 个答案:

答案 0 :(得分:3)

看着:

var motorbike = {
    "Wheel" : move(),
    "Motor" : start()
}; 

这些方法运行,而不是在调用属性时,而是在构建对象时运行!

这就是调用document.write的{​​{1}}的原因,因此您首先会看到来自start的字符串。

尝试运行:

document.write("-Starting<br/>");

您将立即立即看到警报!

你可能可能之后:

var motorbike = {
    "Wheel" : alert('1')
};

答案 1 :(得分:0)

当你写:

var motorbike = {
    "Wheel" : move(),
    "Motor" : start()
};

执行start功能,并打印-Starting

之后会打印

-I'm moving-Broom broom...,因为document.write()对象声明后会调用motorbike函数。

答案 2 :(得分:0)

如果要为对象分配功能,则必须仅指定名称,不带括号:

public class MyProvider implements ExceptionMapper<WebApplicationException> extends ResourceConfig {

     public MyProvider() {
        final Resource.Builder resourceBuilder = Resource.builder();
        resourceBuilder.path("helloworld");

        final ResourceMethod.Builder methodBuilder = resourceBuilder.addMethod("GET");
        methodBuilder.produces(MediaType.TEXT_PLAIN_TYPE)
                .handledBy(new Inflector<ContainerRequestContext, String>() {

            @Override
            public String apply(ContainerRequestContext containerRequestContext) {
                return "Hello World!";
            }
        });

        final Resource resource = resourceBuilder.build();
        registerResources(resource);
    }

    @Override
    public Response toResponse(WebApplicationException ex) {
        String trace = Exceptions.getStackTraceAsString(ex);
        return Response.status(500).entity(trace).type("text/plain").build();
    }
}

如果您说var motorbike = { "Wheel" : move, "Motor" : start }; ,则立即执行移动,并将结果分配给属性Wheel。因此Wheel: move()move都在初始化期间执行,并开始写入开始。在编写startdocument.write(motorbike.Wheel);

之后,会写入结果(如函数返回的字符串)

PS如果分配了这些功能,那么在以后使用它们时,您需要使用括号来调用该函数:document.write(motorbike.Motor);

答案 3 :(得分:0)

Javascript从上到下执行您的代码。

因此函数move()被执行并返回-I'm moving<br/>,其被设置为Wheel的值。然后start()被执行,它会立即将-Starting<br/>写入document。之后的行

document.write(motorbike.Wheel); // MOVE MY MOTORBIKE
document.write(motorbike.Motor); // START MY MOTORBIKE
执行

并将WheelMoter的值附加到文档中。

如果您的start()会返回整个文本,它会按预期工作。

function start(){
   return "-Starting<br/>-Broom broom...";
}