2012-07-25 116 views
2

我有下面的代碼片斷:JavaScript變量訪問錯誤

var ret_ = function(x){ 
    return x; 
} 
var make_cps=function(x,c_){ 
    return c_(x); 
} 
var pred = { 
    _position: 0, 
    setPosition: function (i) { 
     _position = i 
    }, 
    getPosition: function() { 
     return _position 
    }, 
    _size: 0, 
    setSize: function (i) { 
     _size = i 
    }, 
    getSize: function() { 
     return _size 
    }, 
    _context: null, 
    setContext: function (x) { 
     _context = x 
    }, 
    run: function() { 
     return function (c_) { 
      return make_cps(_position, c_); 
     }(ret_) == 2; 
    } 
}  

當運行它象下面,它運行正確:

pred.setPosition(2) 
pred.setSize(10) 
pred.setContext(null) 
var res = pred.run() 
console.log(res) // Output: true 

但如果我更換_positiongetPosition()發生錯誤因爲getPosition()未定義。另外,如果我改變this.getPosition()它說this沒有一個成員叫getPosition()

var pred = { 
    _position: 0, 
    setPosition: function (i) { 
     _position = i 
    }, 
    getPosition: function() { 
     return _position 
    }, 
    _size: 0, 
    setSize: function (i) { 
     _size = i 
    }, 
    getSize: function() { 
     return _size 
    }, 
    _context: null, 
    setContext: function (x) { 
     _context = x 
    }, 
    run: function() { 
     return function (c_) { 
      return make_cps(this.getPosition(), c_); // gives Error here 
     }(ret_) == 2; 
    } 
}  

請人扔光這個問題。

+0

難道是因爲這是一個'c_',這不是在這種情況下定義的? – YePhIcK 2012-07-25 12:04:34

+0

@YePhIcK c_被定義,它由函數的ret_參數提供。我也會添加ret_和make_cps。 – weima 2012-07-25 12:06:30

回答

3

你已經失去了你的語境。在放置this.getPosition()的地方,這將作爲窗口對象返回。

如果你改變了行改爲

return make_cps(pred.getPosition(), c_); 

它會成功運行。

或者,您可以更改運行功能來讀取

run: function() { 
    var that = this; 

    return function (c_) { 
     return make_cps(that.getPosition(), c_); 
    }(ret_) == 2; 
} 

編輯:澄清

之所以_position仍在工作,而不是從同一個問題的痛苦是,你不實際上在您當前的代碼中設置prev._position。

setPosition: function (i) { 
    _position = i 
}, 
getPosition: function() { 
    return _position 
} 

它實際上在做的是創建一個名爲_position的新全局變量,並用它來代替。

此代碼實際上應:

setPosition: function (i) { 
    this._position = i 
}, 
getPosition: function() { 
    return this._position 
}, 
+0

在我的真實應用程序中,我將'pred'對象作爲一個匿名對象,所以我不能使用'pred'來代替'this'。另外我真正的問題是爲什麼'_position'可以工作,但'getPosition()'不能。 – weima 2012-07-25 12:10:16

+0

@ weima在這種情況下,使用替代版本(在底部)。 _position工作的原因,但getPosition並不是你目前正在代碼中錯誤地使用_position。 您目前正在設置和獲取_position而不是prev中的位置變量,從而創建一個新的全局調用_position。 因此,它不關心上下文,因此您的問題不會發生。 – Doug 2012-07-25 12:13:49

+0

太好了。謝謝 :)。有用。它讓我對JavaScript編程有了新的認識。 – weima 2012-07-25 12:15:36

0

這是設置全局變量_position

setPosition: function (i) { 
    _position = i 
}, 

這不是你pred對象的變量。

如果您在此處訪問:

run: function() { 
    return function (c_) { 
     return make_cps(_position, c_); 
    }(ret_) == 2; 
} 

您正在使用的全局變量。

如果你想使用實例的屬性,你將需要開始使用this

setPosition: function (i) { 
    this._position = i 
}, 


run: function() { 
    var pred = this; 
    return function (c_) { 
     return make_cps(pred._position, c_); 
    }(ret_) == 2; 
} 
+0

謝謝。我知道了。但我沒有任何名爲'_position'的全局屬性。你的意思是財產是自動創建的? – weima 2012-07-25 12:19:03

+0

是的,你用'_position = i;'創建它。 – 2012-07-25 12:49:02