Javascript范围和this.Variable

时间:2014-06-21 08:18:48

标签: javascript scope

所以我有一些带有以下(伪)结构的javascript。如何在不专门引用名称赋值(this.last_updated)的情况下,从showUpdates函数设置父函数的my_main_function变量。

var my_main_function = new main()

function main() {
 this.last_updated; 

 function showUpdates(data){
 //set this.last_updated=

 // do Stuff
 }
 this.updateMain(){
  $.ajax({
                 url:"/my_url/"
                 type:"POST",
                 datatype:"json",
                 data: {'last_updated':this.last_updated },
                 success : function(data) { showUpdates(data)},
                 error : function(xhr,errmsg,err) {
                 alert(xhr.status + ": " + xhr.responseText); },
    });
 }
}

1 个答案:

答案 0 :(得分:1)

更新了评论的代码库:

有两种创建对象的方法。

如果你需要多次创建对象,你会这样做:

var YourDefintinon = function() {
};

YourDefintinon.prototype.foo = function() {

};

obj1 = new YourDefintinon();
obj2 = new YourDefintinon();

obj1.foo();

如果您只需要在代码中使用一次,就可以这样做:

var obj = {

};

obj.foo = function() {

};

foo();

所以只有在您的代码看起来如此之后,您才需要main
使用 Function.prototype.bind (以及旧版浏览器的polyfill)将showUpdates绑定到obj

var main = {
  last_updated : null
};

function showUpdates(data){
  this.last_updated = data.update_time;
}

main.updateMain = function () {
  //<< bind showUpdates  to `this` and save the bound function in the local variabel showUpdates
  var showUpdates = showUpdates.bind(this); 

  $.ajax({
     url:"/my_url/"
     type:"POST",
     datatype:"json",
     data: {'last_updated':last_updated },
     success : showUpdates, //<< uses the showUpdates variable not the function
     error : function(xhr,errmsg,err) {
       alert(xhr.status + ": " + xhr.responseText);
     },
  });
};

由于您不想让其他人访问showUpdates,您可以将整个块包装成一个立即被称为的函数:

var main = (function() {
  var main = {
    last_updated : null
  };

  function showUpdates(data){
    this.last_updated = data.update_time;
  }

  main.updateMain = function () {
    var showUpdates = showUpdates.bind(this); 

    $.ajax({
       url:"/my_url/"
       type:"POST",
       datatype:"json",
       data: {'last_updated':last_updated },
       success : showUpdates,
       error : function(xhr,errmsg,err) {
         alert(xhr.status + ": " + xhr.responseText);
       },
    });
  };

  return main;
}());