在方法中调用全局函数?

时间:2015-02-01 23:33:14

标签: javascript arrays frontend javascript-objects

我已经做了一些工作,让我的代码按照我希望的方式运行到某一点。 但是我遇到了一个问题,需要一点点指导来帮助我解决问题。

要解决的问题 代码中的注释将解释我想要存档的内容..

var myArr = ["Brent white","brentw.white"];

function nameFoo (name){
 var strSplit = name.split(" "); // splitting Brent White
 var nameStr = this. myArr; // fetching Brent white string from myArr
console.log (strSplit,myArr[0]);
}

nameFoo("Brent White"); // calling nameFoo function 

var myData = {
  someData:"somedata", 
  someMoreData:"moredata", 
  myName:function(){
// I need to call nameFoo function through myName method.
// My hypothesis is that return will use the (this) keyword within the object?    
  }
};

// Here I need to call the method to have access my nameFoo? Correct me if I am wrong? 
// Is this method invocation?
// Please help..Lost here...

总结一下,我希望myName方法调用nameFoo函数。然后,nameFoo会为我提供myName方法。

如果有人能够表达如何完成最后一步,那么我将非常感激。

指出我正确的方向也将非常感谢.. PS我是JS的新手。

2 个答案:

答案 0 :(得分:2)

小心这个'这个'关键词。通过在全局上下文中调用nameFoo,即:

// some code 
nameFoo(arg);
// some more code

'这'将始终引用' window'。因此,当您调用myData.myName时,即使此对象调用nameFoo方法,' window'仍将在nameFoo' s'中引用。 '这'通常作用于该函数所属的对象。

如果你需要这个'要引用您的一个自定义对象,请使用函数原型方法" call"在你的myName函数中。

var myData = {
   ...
   ...
   myName: function() {
      nameFoo.call(this, someArgument);
   };

请注意,someArgument将是传递给' nameFoo' - 如果您不提供参数,将抛出错误。由您来决定想要传递的内容。

有关Function.prototype.call的更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

有关Function.prototype.apply的更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

两者之间唯一真正的区别是你如何为你正在调用的函数提供参数。使用" call",用逗号分隔参数(就像正常执行函数时一样)。

例如:nameFoo.apply(this, arg1, arg2, arg3);

使用" apply",您将参数作为数组提供。

例如:nameFoo.apply(this, [arg1, arg2, arg3]);

答案 1 :(得分:0)

我认为这在概念上可以帮助你:

// Some names in array
var my_names = ["Brent White", "John Smith"];

// Returns name array [First, Last]
function nameParse(full_name) {
    return full_name.split(" ");
}

// Person object (properties)
function Person(name) {
    this.full_name = name;
    this.name_array = nameParse(name);
    this.first_name = this.name_array[0];
    this.last_name = this.name_array[1];
}

// Create single person example
var brent = new Person(my_names[0]);

// Access properties of brent
console.log(brent);
console.log("Hey, my first name is " + brent.first_name);

// Alternate example --------- //

// Store our people here
var my_people = [];

// Create a person for each name
for (var i = 0, max = my_names.length; i < max; i += 1) {
    var some_person = new Person(my_names[i]);
    my_people.push(some_person);
}

console.log(my_people);