.map()无法访问对象的this.function

时间:2017-09-22 18:42:34

标签: javascript oop google-apps-script

预先感谢任何回复: 我不认为这是重复的:我在第一条评论中回顾了那篇文章,这只是对象的一般细分,并使用"这个"在javascript中。

我的另外这个。功能表现得很好,所以我至少已经了解了JS Obj的基础知识。

此问题与在构造对象中使用带有this.function的.map()有关。

以下Google Appscript代码使用.map()更新二维数组中的字符串。 [[string,int],[string,int]]

出于某种原因,当使用.map()时,它无法访问该功能" this.removeLeadingZero"。如果在OBJ之外放置相同的功能,则可以调用它,一切正常。由于某种原因,系统声称row [0]是[object,Object],但是当我输入(row [0])时,它返回" string"正如它应该。

错误: TypeError:在对象[object Object]中找不到函数removeLeadingZero。 (第106行,文件" DEEP UPC MATCH")

使用this.function在对象中使用.map()或使用不正确的语法是否有任何问题?

function test2DMapping(){
  var tool = new WorkingMappingExample()
  var boot = tool.arrayBuild();
  Logger.log(boot)
}

function WorkingMappingExample(){
    this.arr= [["01234", 100],["401234", 101],["012340", 13],["01234", 0422141],["01234", 2],["12340",3],["01234", 1],["01234", 2],["12340",3],["01234", 1],["01234", 2],["12340",3],["01234", 1],["01234", 2],["12340",3]];
    //mapping appears faster that normal iterations

    this.arrayBuild = function(){
      var newArray1 = 
        this.arr.map( function( row ) {

        **var mUPC = removeLeadingZero2(row[0])**   //working
        **var mUPC = this.removeLeadingZero(row[0])**  // not working 
        var index = row[1]

        Logger.log(mUPC + " " + index)
          row = [mUPC, index]
          return row
        } )
     return newArray1;
     };
  }; //end of OBJ


//THE NEXT 2 FUNCTIONS ARE WORKING OUTSIDE OF THE OBJECT
function removeLeadingZero2(upc){
    try {
        if (typeof(upc[0]) == "string"){
              return upc.replace(/^0+/, '')
        } else {
          var stringer = upc.toString();
          return stringer.replace(/^0+/, '')
        }
    } catch (err) {
      Logger.log(err);
      return upc;
    }
  }

 function trimFirstTwoLastOne (upc) {
    try {
        return upc.substring(2, upc.length - 1); //takes off the first 2 #'s off and the last 1 #'s     
    } catch (err) {
      Logger.log(err);
      return upc;
    }  
  }

2 个答案:

答案 0 :(得分:2)

在传递给map的函数内部,this并未指出您的想法。映射函数有自己的this,它通常引用window

var newArray1 = this.arr.map(function(row) {
  // this === window
  var mUPC = this.removeLeadingZero(row[0]);
  var index = row[1];
  Logger.log(mUPC + " " + index);
  return [mUPC, index];
});

您有四种选择:

  1. Array#map需要thisArg,您可以用map告诉this函数中的var newArray1 = this.arr.map(function(row) { // this === (outer this) var mUPC = this.removeLeadingZero(row[0]); // ... }, this); // pass a thisArg 对象应该是什么:
  2. var newArray1 = this.arr.map(function(row) {
      // this === (outer this)
      var mUPC = this.removeLeadingZero(row[0]);
      // ...
    }.bind(this)); // bind the function to this
    
    1. 手动bind功能:
    2. this:
      1. 存储对外var self = this; var newArray1 = this.arr.map(function(row) { // self === (outer this) var mUPC = self.removeLeadingZero(row[0]); // ... });
      2. 的引用
        var newArray1 = this.arr.map(row => {
          // this === (outer this)
          var mUPC = this.removeLeadingZero(row[0]);
          // ...
        });
        
        1. 使用arrow function
        2. export class SmallComponent{
          private items: Item[] = [];
          
          [...]
          
          openDepositModal(){
              if(!items){
                  this.authService.getUserInventory().subscribe(data => {
                      this.items = data; <-- HERE
                  });
              }
          }
          

          此外,你可以stop using this and new

答案 1 :(得分:0)

我已经解决了这个问题,以下是其他人遇到此问题的答案:

这需要放入变量:
var _this = this;

然后你可以在对象中调用它: var mUPC = _this.removeLeadingZero(row [0])

Javascript范围再次出现!