javascript对象中共享变量的最佳实践

时间:2018-06-25 11:11:03

标签: javascript

在javascript方法中声明一个变量似乎将其范围限定在window-object上,有什么方法可以改变这种行为吗?

var mf = new Array();

mf.init = function () {
    oldIh = 10;
    this.oldIh = 20;
    alert(oldIh); //outputs 10, would prefer 20...
    alert(window.oldIh); //outputs 10.        
}

3 个答案:

答案 0 :(得分:1)

基于注释,如果您要从外部访问内部this.oldIh ,只需使用其函数变量,例如

堆栈片段

var mf = new Array();

mf.init = function () {
    oldIh = 10;
    this.oldIh = 20;
}

mf.init();

console.log(oldIh)
console.log(mf.oldIh)


如果您要使用箭头函数,则this在这种情况下将引用全局范围并更改值,并且可以在不使用函数变量的情况下进行访问。

堆栈片段

var mf = new Array();

mf.init = () => {
    oldIh = 10;
    this.oldIh = 20;
}

mf.init();

console.log(oldIh)

答案 1 :(得分:0)

添加varlet

var mf = new Array();

mf.init = function () {
    let oldIh = 10;
    this.oldIh = 20;
    alert(oldIh); //outputs 10
    alert(window.oldIh); //outputs undefined      
}

mf.init();

答案 2 :(得分:-1)

这很令人困惑。

1)不允许使用 var 声明 this.varaibleName

2)在方法内部使用 var 定义仅用于方法的变量。

3)不使用 var this 都不会创建窗口变量(严格模式下不允许)

4)解决方案是使用不带 var this.variableName ,即使在严格模式下也可以。

@Bean
    public RouterFunction<?> userRouter() {
        return
                RouterFunctions.nest(RequestPredicates.path("/api/user/"),
                        RouterFunctions.nest(RequestPredicates.accept(MediaType.APPLICATION_JSON),
                                RouterFunctions.route(RequestPredicates.POST("/register"), userHandler::register))
                );

    }

    @PostMapping(path = "/register")
    public Mono<EntitySom> register(@RequestBody OwnObject object) {
        return MOno....;
    }

感谢大家为该主题做出贡献。