Как данные передаются анонимным функциям в JavaScript?

Основываясь на ответе @Faisal Naseer. Вот полный пример (с несколькими примечаниями) для использования пользовательского Toolbar с навигацией и меню в Fragment

frag_home.xml



    ...
     


HomeFragment.kt

class HomeFragment : BaseFragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        // setHasOptionsMenu(true): don't need this anymore
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_home, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        toolbar_home.setNavigationIcon(R.drawable.ic_back) // need to set the icon here to have a navigation icon. You can simple create an vector image by "Vector Asset" and using here
        toolbar_home.setNavigationOnClickListener {
            // do something when click navigation
        }

        toolbar_home.inflateMenu(R.menu.menu_home)
        toolbar_home.setOnMenuItemClickListener {
            when (it.itemId) {
                R.id.action_add -> {
                    // do something
                    true
                }
                R.id.action_update -> {
                    // do something
                    true
                }
                else -> {
                    super.onOptionsItemSelected(it)
                }
            }
        }
    }
}

menu_home.xml



    

    


Надеюсь, это поможет

enter image description here

5
задан Benjamin 19 February 2014 в 10:30
поделиться

2 ответа

То, что вы испытываете, является правильным поведением - это нехорошее поведение, но это часть языка. Значение this сбрасывается внутри каждого определения функции . Существует четыре способа вызова функции, для которой используются разные способы установки this.

  1. Обычный вызов функции
     myFunc (param1, param2); 
    Этот способ вызова функции всегда сбрасывает значение this. к глобальному объекту. Это то, что происходит в вашем случае.
  2. Вызов его как метода
     myObj.myFunc (param1, param2); 
    Неудивительно, что это устанавливает «this» для любого объекта, для которого вызывается метод. Здесь "this" == "myObj".
  3. Вызов метода Apply
     myFunc.apply (myObj, [param1, param2]) 
    Это интересный вопрос - здесь this устанавливается для объекта, который вы передаете в качестве первого параметра методу apply - это похоже на вызов метода для объекта, у которого нет этого метода (будьте осторожны, чтобы функция написана так, чтобы она вызывалась). Все функции по умолчанию имеют метод apply.
  4. В качестве конструктора (с «новым»)
     myNewObj = new MyConstructor (param1, param2); 
    Когда вы вызываете функцию таким образом, «this» инициализируется в новый объект, который наследует методы и свойства от свойства прототипа вашей функции. В этом случае новый объект будет унаследован от MyConstructor.prototype. Кроме того, если вы не вернете значение явно, будет возвращено «this».

Решение, которое вы использовали, является рекомендуемым - присвоить внешнее значение this другой переменной, которая по-прежнему будет видна внутри вашей функции. Единственное, что я бы изменил, это называть переменную «that», как говорит Торок Габор, - это своего рода стандарт де-факто, который может облегчить чтение вашего кода другим программистам.

5
ответ дан 14 December 2019 в 04:46
поделиться

You are confused about the closures.

For the first problem, yes, you are right, that is the way it can be done. The only difference that there is a convention to name the variable that that holds this.

MyClass.prototype.trigger = function(){
    var that = this;
    window.setTimeout(function(){that.onTimeout();},1000);
}

There is already a nice thread about this on StackOverflow. Check answers for question How does a javascript closure work?.

Your second problem is an exact duplicate of Javascript closure inside loops - simple practical example.

3
ответ дан 14 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: