function 值传递

解决:什么时候什么样的参数传递,会修改外部参数。
1.参数传入function的过程,是一个值复制的过程。但是引用对象(object array function)保存的是,指针地址,所以传入的也是指针地址。这样,内存中就保持了两个相同的地址,指向同一个对象。

详细解释下:function 传参过程
function change(config){
  config.name = 'changed' 
}

var obj = {name:"unchanged"}
change(obj);

调用function的时候,会进行参数的值传递。
obj = 一个对象吗?错,是对象在堆里的内存地址,
config = obj,是把对象的内存地址复制给config。这样config和obj指向同一个对象,config可以修改外部对象了
var obj1 = {
    value:'111'
};

var obj2 = {
      value:'222'
};

function changeStuff(obj){
      obj.value = '333';
      obj = obj2;
      return obj.value;
}

var foo = changeStuff(obj1);

console.log(foo);// '222' 参数obj指向了新的对象obj2
console.log(obj1.value);//333

理解了这个,就理解了function里的传值了
参考文献:
解释的超级清楚: http://fehacker.com/2014/12/19/call-by-sharing/

apply&call:修改function执行时,this指针对象

首先贴上api:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/apply#apply_and_built-in_functions
mdn官方文档

fn.apply(thisObj,[argumentsArr]),apply的第二个参数是数组(或者类数组)。apply首先会修改function里的this指针,接着把[argumentsArr]数组里的参数一个一个 push fn。
fn.call(thisObj,name,age),call函数则是,如上。

当我们拥有可以改变this指针的fn时候,我们可以做什么呢?

  • 利用apply push arguments的特点,可以解决目标函数只接受传递n个参数,而不是数组的时候

寻找数组最大值
var number = [2,34,43,5,6,6]
Math.max(2,34,43,5,6,6)//因为max方法,不接受数组参数

Math.max.apply(null,number)//
  • 当一个obj没有某个方法,但是其他对象实现了,就可以借助call使用

用的比较多的,通过document.getElementsByTagName选择的dom 节点是一种类似array的array。
它不能应用Array下的push,pop等方法。我们可以通过:
var domNodes =  Array.prototype.slice.call(document.getElementsByTagName("*"));
这样domNodes就可以应用Array下的所有方法了。

也就是说,在没有传入参数的时候,通过call可以让我们的obj拥有其他obj的方法

EMMA
160 声望15 粉丝

简单的日子重复一年


« 上一篇
http协议
下一篇 »
js基础知识点