Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
1

arguments

08.02.2011, 13:23. Показов 2636. Ответов 31
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Обнаружил наистраннейшую вещь - вот этот код:
Javascript
1
2
3
4
5
function args(arg1, arg2) {
    arg1={}
    alert(arguments[0])
}
args(10, 50)
выдаёт [object Object]! По какому-такому правилу???

Добавлено через 2 минуты
Хм, это связано со ссылочными переменными. arg1 - ячейка массива, я её изменяю на тип object, а это ссылочный тип... и что-то непонятно... arg1-то не объект по началу и по идее не должен ссылаться...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2011, 13:23
Ответы с готовыми решениями:

Arguments.callee.name
TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode...

arguments[] не могу понять что не так
function sum() { var s; for(var i=0;i<arguments.length;i++) s=arguments; ...

Write a function nextInLine which takes an array (arr) and a number (item) as arguments.
https://www.freecodecamp.org/challenges/stand-in-line Ничего не могу понять. Просят создать...

Чем заменить arguments.callee?
Есть функция: (function() { alert('example...'); window.setTimeout(arguments.callee,...

31
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
08.02.2011, 15:00 2
Hagrael, Это специально так и было задумано. Изменение формального параметра изменяет соответствующую запись в arguments и наоборот.
1
307 / 165 / 25
Регистрация: 07.02.2011
Сообщений: 319
08.02.2011, 15:29 3
У объекта Arguments есть одна очень необычная особенность. Когда у функции имеются именованные аргументы, элементы массива объекта Arguments являются синонимами локальных переменных, содержащих аргументы функции. Массив arguments[] и именованные аргументы - это два разных средства обращения к одной переменной. Изменение значения аргумента через имя аргумента меняет значение, извлекаемое через массив arguments[]. Изменение значения аргумента через массив arguments[] меняет значение, извлекаемое по имени аргумента.

Пример:

Javascript
1
2
3
4
5
function f(x){
  alert(x);
  arguments[0]=null; //изменяя аргумент массива изменяется и x
  alert(x);               //выводит null
}
Определённо это не совсем то поведение, которое можно ожидать от настоящего массива. В этом случае arguments[0] и х могли бы ссылаться на одно и то же значение, но изменение одной ссылки не должно оказывать влияния на другое.
2
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
09.02.2011, 11:53  [ТС] 4
Значит, это исключение. Большое спасибо за такой подробный рассказ.

Добавлено через 18 часов 3 минуты
Ещё один вопрос, он касается логических операций. Как я понял, при сравнении объектов и функций сравнивается их "url" в ОЗУ, а при сравнении переменных с др. типами сравнивается их значение. Так?
0
307 / 165 / 25
Регистрация: 07.02.2011
Сообщений: 319
09.02.2011, 12:31 5
Hagrael, Если ты емеешь ввиду логическую операцию сравнения то существует два способа сравнения ==(равенство) и ===(идентичность).
В JS числовые, строковые и логические значения сравниваются по значению. В этом случае рассматриваются две различные величины, а операторы == и === проверяют, идентичны ли эти два значения. Это значит, что две переменные равны или идентичны, только если они содержат одинаковое значение. Например, две строки равны, только если обе содержат в точночти одинаковые символы.
В то же время объекты, массивы и функции сравниваются по ссылке. Это значит, что две переменные равны, только если они ссылаются на один объект. Два различных массива не могут быть равными или идентичными даже если они содержат равные или идентичные элементы. Две переменные, содержащие сылки на объекты, массивы или функции, равны, только если они ссылаются на один и тот же объект, массив или функцию.
Основное отличие операторов == и === заключается в том, что === возвращает false если типы двух переменных не совпадают, а == всё же пытается преобразовать один тип к другому.

Пример:
Javascript
1
2
alert(1=='1');      //  true
alert(1==='1');   //  false
1
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
09.02.2011, 14:58  [ТС] 6
Kdn, ещё раз большое спасибо Ещё один маленький вопросик - при перечислении for (prop in obj), где obj - массив, выдаваться будут только его ячейки, да?
0
307 / 165 / 25
Регистрация: 07.02.2011
Сообщений: 319
09.02.2011, 15:09 7
Hagrael, Выдаваться куда? Если ты емеешь ввиду что будет записано в prop, то туда будет передан индекс массива, т.е:

Javascript
1
2
3
4
5
6
7
8
9
var obj = ['w','e','rrr']
 
for (prop in obj){
    alert("alert = "+prop) 
}
 
//  alert= 0
//  alert= 1
//  alert= 2
1
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
09.02.2011, 16:22 8
Оператор for..in будет перечислять также свойства прототипа. Для отличия их от собственных свойств есть метод hasOwnProperty
Javascript
1
2
3
4
5
6
7
Array.prototype.Foo = function(){};
 
var a = [10, 20, 30], k;
for (k in a) {
    alert(k);
};
// Увидим 0, 1, 2, Foo
1
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
09.02.2011, 17:07  [ТС] 9
Всё понятно
0
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
15.02.2011, 13:45  [ТС] 10
А самому никакими средствами нельзя запретить показ каких-то функций при перечислении в цикле for in?
0
307 / 165 / 25
Регистрация: 07.02.2011
Сообщений: 319
15.02.2011, 15:15 11
Hagrael, Можно попробовать использовать замыкания.
В этом случае внутри объекта класса допустим ты храниш массив функций.
Объект так же имеет одну функцию, скажем getFunction(index) . Она извлекает по индексу функцию.
При вызове for in у данного объекта она покажет лишь getFunction. И Всё.
Ну а если сложнее нужно то можно не по индексу а по имени например замаскировать.

Если не понял, могу пример написать.

Добавлено через 11 минут
Да забыл сказать что такая реализация подойдёт для динамического создания функций.
С наследованием через прототип такое не прокатит
0
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
15.02.2011, 15:48  [ТС] 12
Kdn, ну эта реализация очень убогая ИМХО.
0
307 / 165 / 25
Регистрация: 07.02.2011
Сообщений: 319
15.02.2011, 16:57 13
Hagrael, Я ведь не ясновидящий, и не знаю как и для чего тебе это вообще надо. Просто предлогаю вариант.Предложи лучше =)
0
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
15.02.2011, 17:01  [ТС] 14
Kdn, лучше ничего нет
0
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
16.02.2011, 16:55 15
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var Class = (function(){
    function bar() {
    }
    
    var C = function(){
        this.foo();
        bar.call(this);
    };
    C.prototype = {
        foo : function() {
        }
    };
    return C;
})();
 
var o = new Class();
Тогда тот bar точно не появится в for..in.
1
307 / 165 / 25
Регистрация: 07.02.2011
Сообщений: 319
16.02.2011, 17:18 16
Vovan-VE, Я ему предлагал использовать замыкания.
0
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
16.02.2011, 18:13  [ТС] 17
Vovan-VE, но и извне нельзя будет обратиться к функции bar.
0
307 / 165 / 25
Регистрация: 07.02.2011
Сообщений: 319
16.02.2011, 18:26 18
Hagrael, нельзя. И у дочернего класса bar так же будет не доступен.
0
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
16.02.2011, 18:30 19
Цитата Сообщение от Hagrael Посмотреть сообщение
но и извне нельзя будет обратиться к функции bar.
Да, нельзя. Значит никак.
1
БТР - мой друг
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
17.02.2011, 11:25  [ТС] 20

Не по теме:

Vovan-VE, Kdn, а если не секрет, вы где-нибудь работаете? Или у вас свои проекты? Просто интересно, куда идет большая часть веб-программистов - на фирмы или создают свои проекты. Хотя последнее, как мне кажется, сделать сложно.



Добавлено через 16 часов 30 минут
А ведь получается, что при вызове функции все ее локальные переменные создаются и остаются в памяти до окончания просмотра страницы, так? Ведь как бы иначе работали замыкания?
0
17.02.2011, 11:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.02.2011, 11:25
Помогаю со студенческими работами здесь

NoReverseMatch at / Reverse for 'detail_news' with arguments '('',)' and keyword arguments '{}' not found...
<h2 class="nospace push10"><a href="{% url 'news:detail_news' new.id %}"><span...

Too many output arguments
Помогите найти ошибку. Может я неправильно вызываю функцию? Вызываю так: y = v_18(1,5).Вот код...

Error: too many arguments
При отладке показывает на кусок кода: (IF (= J 1) (SETQ TT1 BT ; координаты первого угла...

Too few arguments to function
Доброго времени суток! Возникла проблема при компиляции кода, собственно на скриншотах ниже, никак...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru