包含数组的函数参数

时间:2018-11-02 22:49:34

标签: javascript

所以,我有一个问题。在函数内部,我具有一个创建li的createElement()函数。我还使用setAttribute()函数添加onclick()。但是,这是我的问题,我可以像在onclick()中那样存储数组,以便在新的函数参数中获取该数组吗?我应该在'changeClass(“'+'”);')里面放什么? (“名称”是一个包含数组的全局变量。“ numberOfCookies”没什么好担心的。)

function getClassCookie() {
  var cookiesArray = document.cookie.split(';');
  numberOfCookies = cookiesArray.length;
  for (var i = 0; i < cookiesArray.length; i++) {
    var nameValueArray = cookiesArray[i].split('=');
    var split = nameValueArray[1].split(',');
    var className = split[0];
    var copySplit = split.slice();
    copySplit.splice(0, 1);
    names = copySplit;
    var newLi = document.createElement('li');
    var textNode = document.createTextNode(className);

    newLi.setAttribute('onclick', 'changeClass("' + '");');

    newLi.setAttribute('onclick', 'hideDropdown();');
    newLi.appendChild(textNode);
    var parent = document.getElementById('classes');
    parent.appendChild(newLi);
  }
}

function changeClass(c) {
  names = c;
}

2 个答案:

答案 0 :(得分:0)

如果您使用Javascript(例如addEventListener)正确附加处理程序,则可以在处理程序中使用带有 closures 的数组。 (内联处理程序通常很难管理,而且也不被认为是好的做法)。例如,一旦声明了newLi,只需在以后引用要调用changeClass的数组即可:

newLi.addEventListener('click', function() {
  changeClass(copySplit);
});

以上代码将允许在copySplit循环中创建的for成为以后单击newLi时引用的那个。 (当您使用嵌入式处理程序时,此技术是不可能的)

还有一件事情-用var声明的变量被提升 且具有直观的函数作用域,而不是块作用域。确保使用constlet来代替它们,它们具有块作用域(这样,循环的每个迭代都具有变量的单独绑定,而不是所有共享同一组变量的迭代):

for (let i = 0; i < cookiesArray.length; i++) {
  const nameValueArray = cookiesArray[i].split('=');
  const split = nameValueArray[1].split(',');
  const className = split[0];
  const copySplit = split.slice();
  // etc

答案 1 :(得分:0)

在将函数名称附加到属性时,使用字符串串联作为函数名称并不是一个好方法。只需使用功能挂钩。如果您需要将参数传递给它,那么您也可以在匿名调用中做到这一点。

在下面的示例中,请注意,演示数组由于其范围而在随后的点击中保持其状态。

function handler(arr){
 arr.push(arr.length);
 console.log(arr);
}
(function demo(){
 var newButton = document.createElement('button');
 newButton.textContent = "Demo";
 var someArray = [];
 newButton.onclick = function(){
  handler(someArray);
 }
 document.body.appendChild(newButton);
})()